ALFAIRCBot.ALFAIRCBot.OnCommandPage C# (CSharp) Метод

OnCommandPage() приватный Метод

private OnCommandPage ( string Source, string Nick, string Query ) : void
Source string
Nick string
Query string
Результат void
        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);
            }
        }