public override void HandleRequest()
{
int Type = 0;
Dictionary<string, string> QueryString = Request.QueryString;
// make sure we have a valid player ID
if (!QueryString.ContainsKey("type") || !Int32.TryParse(QueryString["type"], out Type))
{
Response.WriteResponseStart(false);
Response.WriteHeaderLine("asof", "err");
Response.WriteDataLine(DateTime.UtcNow.ToUnixTimestamp(), "Invalid Syntax!");
Response.Send();
return;
}
// NOTE: The HttpServer will handle the DbConnectException
using (Database = new StatsDatabase())
{
// Filler Variables
int I = 0;
float F;
string S;
List<DbParameter> Params = new List<DbParameter>();
// Prepare Query
SelectQueryBuilder Query = new SelectQueryBuilder(Database);
Query.SelectColumns("id", "name");
Query.SelectFromTable("player");
Query.SetWhereOperator(LogicOperator.And);
Query.AddWhere("ip", Comparison.NotEqualTo, "0.0.0.0");
Query.AddOrderBy("id", Sorting.Ascending);
WhereClause Where = null;
switch (Type)
{
// Blacklist
case 0:
int BanLimit = (QueryString.ContainsKey("banned") && Int32.TryParse(QueryString["banned"], out I)) ? I : 100;
Where = new WhereClause("banned", Comparison.GreaterOrEquals, BanLimit);
Where.AddClause(LogicOperator.Or, "permban", Comparison.Equals, 1);
break;
// Whitelist
case 1:
if (QueryString.ContainsKey("clantag"))
{
Where = new WhereClause("clantag", Comparison.Equals, QueryString["clantag"]);
Where.AddClause(LogicOperator.And, "permban", Comparison.Equals, 0);
}
break;
// Greylist
case 2:
// List of possible query's
string[] Queries = new string[] { "score", "rank", "time", "kdratio", "country", "banned" };
foreach (string Param in Queries)
{
if (QueryString.ContainsKey(Param))
{
switch (Param)
{
case "score":
case "time":
case "rank":
if (Int32.TryParse(QueryString[Param], out I))
{
if (Where == null)
Where = new WhereClause(Param, Comparison.GreaterOrEquals, I);
else
Where.AddClause(LogicOperator.And, Param, Comparison.GreaterOrEquals, I);
}
break;
case "kdratio":
if (float.TryParse(QueryString["kdratio"], out F))
{
if (Where == null)
Where = new WhereClause("(kills / deaths)", Comparison.GreaterOrEquals, F);
else
Where.AddClause(LogicOperator.And, "(kills / deaths)", Comparison.GreaterOrEquals, F);
}
break;
case "country":
S = QueryString["country"].Replace(",", "','");
if (Where == null)
Where = new WhereClause(Param, Comparison.In, S.Split(','));
else
Where.AddClause(LogicOperator.And, Param, Comparison.In, S.Split(','));
break;
case "banned":
if (Int32.TryParse(QueryString["banned"], out I))
{
if (Where == null)
Where = new WhereClause("banned", Comparison.LessThan, I);
else
Where.AddClause(LogicOperator.And, "banned", Comparison.LessThan, I);
Where.AddClause(LogicOperator.And, "permban", Comparison.Equals, 0);
}
break;
}
}
}
break;
}
// Pepare 2 output headers
int size = 0;
FormattedOutput Output1 = new FormattedOutput("size", "asof");
FormattedOutput Output2 = new FormattedOutput("pid", "nick");
// Query the database, add each player to Output 2
if (Where != null) Query.AddWhere(Where);
List<Dictionary<string, object>> Players = Database.ExecuteReader(Query.BuildCommand());
foreach (Dictionary<string, object> P in Players)
{
size++;
Output2.AddRow(P["id"].ToString(), P["name"].ToString());
}
// Send Response
Output1.AddRow(size, DateTime.UtcNow.ToUnixTimestamp());
Response.AddData(Output1);
Response.AddData(Output2);
Response.Send();
}
}