private void OnCommandPage(string Source, string Nick, string Query)
{
try
{
string MessagePart;
string NamePart;
int NamePartEnd;
string Destination;
int Offset;
uint Tick = (uint)Environment.TickCount;
int DestinationPlayerId = 0;
int DestinationCharacterId = 0;
int DestinationServerId = 0;
string ServerName = null;
string PlayerName = null;
string CharacterName = null;
IncrementStatistic("IRC_COMMAND_PAGE");
GetPageFromPlayerId();
if (PageFromPlayerId == 0)
{
SendMessage(SendType.Message, Source, "Page from player name is not configured properly.");
return;
}
//
// Parse the destination field out.
//
Destination = Query;
if (Destination.Length < 2)
return;
//
// Find the end of the name, which is either a second double quote,
// or a space character.
//
if (Destination[0] == '\"')
{
Offset = Destination.IndexOf('\"', 1);
if (Offset == -1)
{
SendMessage(SendType.Message, Source,
"Illegal page command format (unmatched quote in destination).");
return;
}
Destination = Destination.Substring(0, Offset);
NamePart = Destination.Substring(1); // Past the first quote
NamePartEnd = Offset;
MessagePart = Query.Substring(1 + Offset);
//
// Eat up to one single trailing space.
//
if (MessagePart.Length > 1 && Char.IsWhiteSpace(MessagePart[0]))
MessagePart = MessagePart.Substring(1);
}
else
{
Offset = Destination.IndexOf(' ');
if (Offset == -1)
{
SendMessage(SendType.Message, Source,
"Illegal page command format (missing destination).");
return;
}
Destination = Destination.Substring(0, Offset);
NamePart = Destination;
NamePartEnd = Offset;
MessagePart = Query.Substring(Offset + 1); // After the space
}
if (Tick - LastPage < PAGE_THROTTLE)
{
SendMessage(SendType.Message, Source, "A short delay between page requests is required.");
return;
}
using (MySqlDataReader Reader = ExecuteQuery(String.Format(
"SELECT " +
"players.Id AS player_id, " +
"characters.Id AS character_id, " +
"servers.Id AS server_id, " +
"players.Name AS player_name, " +
"characters.Name AS character_name, " +
"servers.Name AS server_name " +
"FROM " +
"players " +
"INNER JOIN characters ON characters.PlayerID = players.ID " +
"INNER JOIN servers ON servers.ID = characters.ServerID " +
"WHERE characters.IsOnline = 1 " +
"AND players.Name = '{0}' ", MySqlHelper.EscapeString(NamePart))))
{
if (Reader.Read())
{
DestinationPlayerId = Reader.GetInt32(0);
DestinationCharacterId = Reader.GetInt32(1);
DestinationServerId = Reader.GetInt32(2);
PlayerName = Reader.GetString(3);
CharacterName = Reader.GetString(4);
ServerName = Reader.GetString(5);
}
}
//
// Try looking up by character name too if the player name
// query failed.
//
if (DestinationPlayerId == 0)
{
using (MySqlDataReader Reader = ExecuteQuery(String.Format(
"SELECT " +
"players.Id AS player_id, " +
"characters.Id AS character_id, " +
"servers.Id AS server_id, " +
"players.Name AS player_name, " +
"characters.Name AS character_name, " +
"servers.Name AS server_name " +
"FROM " +
"characters " +
"INNER JOIN players ON players.ID = characters.PlayerID " +
"INNER JOIN servers ON servers.ID = characters.ServerID " +
"WHERE characters.IsOnline = 1 " +
"AND characters.Name = '{0}' ", MySqlHelper.EscapeString(NamePart))))
{
if (!Reader.Read())
{
SendMessage(SendType.Message, Source, String.Format(
"{0} is not logged on.", NamePart));
return;
}
DestinationPlayerId = Reader.GetInt32(0);
DestinationCharacterId = Reader.GetInt32(1);
DestinationServerId = Reader.GetInt32(2);
PlayerName = Reader.GetString(3);
CharacterName = Reader.GetString(4);
ServerName = Reader.GetString(5);
}
}
MessagePart = String.Format("<From: {0}@{1}> {2}", Nick, Source, MessagePart);
if (MessagePart.Length > ACR_SERVER_IPC_MAX_EVENT_LENGTH)
MessagePart = MessagePart.Substring(0, ACR_SERVER_IPC_MAX_EVENT_LENGTH);
SendMessageToPlayer(DestinationPlayerId, DestinationServerId, MessagePart);
SendMessage(SendType.Message, Source, String.Format(
"Message sent to {0} ({1}) at {2}.",
CharacterName,
PlayerName,
ServerName));
LastPage = Tick;
}
catch (Exception e)
{
SendMessage(SendType.Message, Source, "Internal error communicating with database.");
Console.WriteLine("Exception handling !page request: {0}", e);
}
}