private void OnCommandPlayers(string Source)
{
Dictionary<int, SERVER_DATA> ServerInfoTable = new Dictionary<int, SERVER_DATA>();
SERVER_DATA ServerData = new SERVER_DATA();
IncrementStatistic("IRC_COMMAND_PLAYERS");
string QueryFmt =
"SELECT " +
"COUNT(`characters`.`ID`) AS character_count, " +
"`servers`.`Name` AS server_name, " +
"`servers`.`ID` AS server_id, " +
"`pwdata_health`.`Value` as server_health_status, " +
"`pwdata_vault`.`Value` as server_vault_status " +
"FROM `characters` " +
"INNER JOIN `players` ON `players`.`ID` = `characters`.`PlayerID` " +
"INNER JOIN `servers` ON `servers`.`ID` = `characters`.`ServerID` " +
"INNER JOIN `pwdata` ON `pwdata`.`Name` = `servers`.`Name` " +
"LEFT OUTER JOIN `pwdata` AS `pwdata_health` ON `pwdata_health`.`Name` = `servers`.`Name` " +
"AND `pwdata_health`.`Key` = 'ACR_HEALTHMONITOR_STATUS' " +
"LEFT OUTER JOIN `pwdata` AS `pwdata_vault` ON `pwdata_vault`.`Name` = `servers`.`Name` " +
"AND `pwdata_health`.`Key` = 'ACR_HEALTHMONITOR_VAULT_STATUS' " +
"WHERE `characters`.`IsOnline` = 1 " +
"AND `players`.IsDM = {0} " +
"AND `pwdata`.`Key` = 'ACR_TIME_SERVERTIME' " +
"AND `pwdata`.`Last` >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 10 MINUTE) " +
"GROUP BY `characters`.`ServerID` "
;
using (MySqlDataReader Reader = ExecuteQuery(String.Format(QueryFmt, 0)))
{
while (Reader.Read())
{
int ServerId = Reader.GetInt32(2);
if (!ServerInfoTable.TryGetValue(ServerId, out ServerData))
ServerInfoTable.Add(ServerId, new SERVER_DATA());
ServerInfoTable[ServerId].Players = Reader.GetInt32(0);
ServerInfoTable[ServerId].Name = Reader.GetString(1);
ServerInfoTable[ServerId].ServerId = Reader.GetInt32(2);
if (Reader.IsDBNull(3))
ServerInfoTable[ServerId].HealthStatus = -1;
else
ServerInfoTable[ServerId].HealthStatus = Reader.GetInt32(3);
if (Reader.IsDBNull(4))
ServerInfoTable[ServerId].VaultOnline = true;
else
{
switch (Reader.GetInt32(4))
{
case 0:
default:
ServerInfoTable[ServerId].VaultOnline = true;
break;
case 1:
ServerInfoTable[ServerId].VaultOnline = false;
break;
}
}
}
}
using (MySqlDataReader Reader = ExecuteQuery(String.Format(QueryFmt, 1)))
{
while (Reader.Read())
{
int ServerId = Reader.GetInt32(2);
//
// We might have a server show up here for the first time
// if it had DMs only and no regular players.
//
if (!ServerInfoTable.TryGetValue(ServerId, out ServerData))
{
ServerInfoTable.Add(ServerId, new SERVER_DATA());
ServerInfoTable[ServerId].Players = 0;
ServerInfoTable[ServerId].Name = Reader.GetString(1);
ServerInfoTable[ServerId].ServerId = Reader.GetInt32(2);
if (Reader.IsDBNull(3))
ServerInfoTable[ServerId].HealthStatus = -1;
else
ServerInfoTable[ServerId].HealthStatus = Reader.GetInt32(3);
if (Reader.IsDBNull(4))
ServerInfoTable[ServerId].VaultOnline = true;
else
{
switch (Reader.GetInt32(4))
{
case 0:
default:
ServerInfoTable[ServerId].VaultOnline = true;
break;
case 1:
ServerInfoTable[ServerId].VaultOnline = false;
break;
}
}
}
ServerInfoTable[ServerId].DMs = Reader.GetInt32(0);
}
}
StringBuilder Output = new StringBuilder("Servers with activity: " );
bool First = true;
if (ServerInfoTable.TryGetValue(3, out ServerData))
ServerData.Name = "TSM";
if (ServerInfoTable.TryGetValue(9, out ServerData))
ServerData.Name = "MS";
if (ServerInfoTable.TryGetValue(10, out ServerData))
ServerData.Name = "BG";
if (ServerInfoTable.TryGetValue(11, out ServerData))
ServerData.Name = "WHL";
//
// Now show the results.
//
foreach (SERVER_DATA Entry in ServerInfoTable.Values)
{
if (First == false)
{
Output.Append("; ");
}
else
{
First = false;
}
string VaultStatusString;
if (Entry.VaultOnline)
VaultStatusString = "";
else
VaultStatusString = " *VAULT DISCONNECTED*";
Output.AppendFormat("{0}: {1} player{2}, {3} DM{4}{5}{6}",
Entry.Name,
Entry.Players,
Entry.Players == 1 ? "" : "s",
Entry.DMs,
Entry.DMs == 1 ? "" : "s",
GetServerHealthStatusString(Entry.HealthStatus),
VaultStatusString);
}
if (First)
SendMessage(SendType.Message, Source, "No players are logged on to any servers.");
else
SendMessage(SendType.Message, Source, Output.ToString());
// Console.WriteLine(Output.ToString());
/*
ServerInfoTable[3].Name = "TSM";
ServerInfoTable[9].Name = "BG";
ServerInfoTable[10].Name = "MS";
Console.WriteLine(String.Format(
"{0}: {1} player(s), {2}DM(s); {3}: {4} player(s) and {5} DM(s); {6}: {7} player(s) and {8} DM(s)",
ServerInfoTable[3].Name,
ServerInfoTable[3].Players,
ServerInfoTable[3].DMs,
ServerInfoTable[10].Name,
ServerInfoTable[10].Players,
ServerInfoTable[10].DMs,
ServerInfoTable[9].Name,
ServerInfoTable[9].Players,
ServerInfoTable[9].DMs));
SendMessage(SendType.Message, Source, String.Format(
"{0}: {1} player(s), {2}DM(s); {3}: {4} player(s) and {5} DM(s); {6}: {7} player(s) and {8} DM(s)",
ServerInfoTable[3].Name,
ServerInfoTable[3].Players,
ServerInfoTable[3].DMs,
ServerInfoTable[10].Name,
ServerInfoTable[10].Players,
ServerInfoTable[10].DMs,
ServerInfoTable[9].Name,
ServerInfoTable[9].Players,
ServerInfoTable[9].DMs));
*/
}