internal static ChannelModeInfo[] ParseModes(string[] tokens, int start)
        {
            //This nice piece of code was contributed by Klemen Šavs.
            //25 October 2003
            ArrayList modeInfoArray = new ArrayList();
            int       i             = start;

            while (i < tokens.Length)
            {
                ChannelModeInfo modeInfo  = new ChannelModeInfo();
                int             parmIndex = i + 1;
                for (int j = 0; j < tokens[i].Length; j++)
                {
                    while (j < tokens[i].Length && tokens[i][j] == '+')
                    {
                        modeInfo.Action = ModeAction.Add;
                        j++;
                    }
                    while (j < tokens[i].Length && tokens[i][j] == '-')
                    {
                        modeInfo.Action = ModeAction.Remove;
                        j++;
                    }
                    if (j == 0)
                    {
                        throw new Exception();
                    }
                    else if (j < tokens[i].Length)
                    {
                        switch (tokens[i][j])
                        {
                        case 'o':
                        case 'h':
                        case 'v':
                        case 'b':
                        case 'e':
                        case 'I':
                        case 'k':
                        case 'O':
                            modeInfo.Mode      = Rfc2812Util.CharToChannelMode(tokens[i][j]);
                            modeInfo.Parameter = tokens[parmIndex++];
                            break;

                        case 'l':
                            modeInfo.Mode = Rfc2812Util.CharToChannelMode(tokens[i][j]);
                            if (modeInfo.Action == ModeAction.Add)
                            {
                                modeInfo.Parameter = tokens[parmIndex++];
                            }
                            else
                            {
                                modeInfo.Parameter = "";
                            }
                            break;

                        default:
                            modeInfo.Mode      = Rfc2812Util.CharToChannelMode(tokens[i][j]);
                            modeInfo.Parameter = "";
                            break;
                        }
                    }
                    modeInfoArray.Add(modeInfo.MemberwiseClone());
                }
                i = parmIndex;
            }

            ChannelModeInfo[] modes = new ChannelModeInfo[modeInfoArray.Count];
            for (int k = 0; k < modeInfoArray.Count; k++)
            {
                modes[k] = (ChannelModeInfo)modeInfoArray[k];
            }
            return(modes);
        }
Exemple #2
0
        internal void Parse(Connection connection, string message)
        {
            Debug.WriteLineIf(DccUtil.DccTrace.TraceInfo, "[" + Thread.CurrentThread.Name + "] DccListener::Parse()");
            Match  match     = parser.Match(message);
            string requestor = match.Groups[1].ToString();

            string[] tokens = tokenizer.Split(match.Groups[2].ToString().Trim());
            switch (tokens[Action])
            {
            case CHAT:
                if (OnDccChatRequest != null)
                {
                    //Test for sufficient number of arguments
                    if (tokens.Length < 4)
                    {
                        connection.Listener.Error(ReplyCode.UnparseableMessage, "Incorrect CHAT arguments: " + message);
                        return;
                    }
                    //Send event
                    DccUserInfo dccUserInfo = null;
                    try
                    {
                        dccUserInfo = new DccUserInfo(
                            connection,
                            Rfc2812Util.ParseUserInfoLine(requestor),
                            new IPEndPoint(DccUtil.LongToIPAddress(tokens[Address]), int.Parse(tokens[Port], CultureInfo.InvariantCulture)));
                    }
                    catch (ArgumentException)
                    {
                        connection.Listener.Error(ReplyCode.BadDccEndpoint, "Invalid TCP/IP connection information sent.");
                        return;
                    }
                    try
                    {
                        OnDccChatRequest(dccUserInfo);
                    }
                    catch (ArgumentException ae)
                    {
                        connection.Listener.Error(ReplyCode.UnknownEncryptionProtocol, ae.ToString());
                    }
                }
                break;

            case SEND:
                //Test for sufficient number of arguments
                if (tokens.Length < 5)
                {
                    connection.Listener.Error(ReplyCode.UnparseableMessage, "Incorrect SEND arguments: " + message);
                    return;
                }
                if (OnDccSendRequest != null)
                {
                    DccUserInfo dccUserInfo = null;
                    try
                    {
                        dccUserInfo = new DccUserInfo(
                            connection,
                            Rfc2812Util.ParseUserInfoLine(requestor),
                            new IPEndPoint(DccUtil.LongToIPAddress(tokens[Address]), int.Parse(tokens[Port], CultureInfo.InvariantCulture)));
                    }
                    catch (ArgumentException ae)
                    {
                        connection.Listener.Error(ReplyCode.BadDccEndpoint, ae.ToString());
                        return;
                    }
                    try
                    {
                        OnDccSendRequest(
                            dccUserInfo,
                            tokens[FileName],
                            int.Parse(tokens[FileSize], CultureInfo.InvariantCulture),
                            IsTurbo(5, tokens));
                    }
                    catch (ArgumentException ae)
                    {
                        connection.Listener.Error(ReplyCode.UnknownEncryptionProtocol, ae.ToString());
                    }
                }
                break;

            case GET:
                //Test for sufficient number of arguments
                if (tokens.Length < 2)
                {
                    connection.Listener.Error(ReplyCode.UnparseableMessage, "Incorrect GET arguments: " + message);
                    return;
                }
                if (OnDccGetRequest != null)
                {
                    try
                    {
                        OnDccGetRequest(
                            new DccUserInfo(
                                connection,
                                Rfc2812Util.ParseUserInfoLine(requestor)),
                            tokens[FileName],
                            IsTurbo(2, tokens));
                    }
                    catch (ArgumentException ae)
                    {
                        connection.Listener.Error(ReplyCode.UnknownEncryptionProtocol, ae.ToString());
                    }
                }
                break;

            case ACCEPT:
                //Test for sufficient number of arguments
                if (tokens.Length < 4)
                {
                    connection.Listener.Error(ReplyCode.UnparseableMessage, "Incorrect DCC ACCEPT arguments: " + message);
                    return;
                }
                //DccListener will try to handle Receive at correct file position
                try
                {
                    DccFileSession session = DccFileSessionManager.DefaultInstance.LookupSession("C" + tokens[2]);
                    session.OnDccAcceptReceived(long.Parse(tokens[3], CultureInfo.InvariantCulture));
                }
                catch (ArgumentException e)
                {
                    connection.Listener.Error(ReplyCode.UnableToResume, e.ToString());
                }
                break;

            case RESUME:
                //Test for sufficient number of arguments
                if (tokens.Length < 4)
                {
                    connection.Listener.Error(ReplyCode.UnparseableMessage, "Incorrect DCC RESUME arguments: " + message);
                    return;
                }
                //DccListener will automatically handle Resume/Accept interaction
                try
                {
                    DccFileSession session = DccFileSessionManager.DefaultInstance.LookupSession("S" + tokens[2]);
                    session.OnDccResumeRequest(long.Parse(tokens[3], CultureInfo.InvariantCulture));
                }
                catch (ArgumentException e)
                {
                    connection.Listener.Error(ReplyCode.UnableToResume, e.ToString());
                }
                break;

            default:
                connection.Listener.Error(ReplyCode.UnparseableMessage, message);
                Debug.WriteLineIf(DccUtil.DccTrace.TraceError, "[" + Thread.CurrentThread.Name + "] DccListener::Parse() Unknown DCC command");
                break;
            }
        }
 internal void Parse(string line)
 {
     string[] ctcpTokens = TokenizeMessage(line);
     if (ctcpTokens != null)
     {
         if (ctcpTokens[Command].ToUpper(CultureInfo.CurrentCulture) == CtcpUtil.Ping)
         {
             if (connection.CtcpSender.IsMyRequest(ctcpTokens[Text]))
             {
                 connection.CtcpSender.ReplyReceived(ctcpTokens[Text]);
                 if (OnCtcpPingReply != null)
                 {
                     OnCtcpPingReply(Rfc2812Util.UserInfoFromString(ctcpTokens[Name]), ctcpTokens[Text]);
                 }
             }
             else
             {
                 //Ignore PING's with now parameters
                 if (ctcpTokens[Text] != null && ctcpTokens[Text].TrimEnd().Length != 0)
                 {
                     if (OnCtcpPingRequest != null)
                     {
                         OnCtcpPingRequest(Rfc2812Util.UserInfoFromString(ctcpTokens[Name]), ctcpTokens[Text]);
                     }
                 }
             }
         }
         else
         {
             if (IsReply(ctcpTokens))
             {
                 if (OnCtcpReply != null)
                 {
                     OnCtcpReply(ctcpTokens[Command].ToUpper(CultureInfo.CurrentCulture), Rfc2812Util.UserInfoFromString(ctcpTokens[Name]), ctcpTokens[Text]);
                 }
             }
             else
             {
                 if (OnCtcpRequest != null)
                 {
                     OnCtcpRequest(ctcpTokens[Command].ToUpper(CultureInfo.CurrentCulture), Rfc2812Util.UserInfoFromString(ctcpTokens[Name]));
                 }
             }
         }
     }
     else
     {
         connection.Listener.Error(ReplyCode.UnparseableMessage, line);
         Debug.WriteLineIf(CtcpUtil.CtcpTrace.TraceWarning, "Unknown CTCP command '" + line + "' recieved by CtcpListener");
     }
 }
Exemple #4
0
        /// <summary>
        /// Parse the message and call the callback methods on the listeners.
        /// </summary>
        /// <param name="tokens">The text received from the IRC server</param>
        void ParseCommand(string[] tokens)
        {
            //Remove colon user info string
            tokens[0] = RemoveLeadingColon(tokens[0]);
            switch (tokens[1])
            {
            case NOTICE:
                tokens[3] = RemoveLeadingColon(tokens[3]);
                if (Rfc2812Util.IsValidChannelName(tokens[2]))
                {
                    if (OnPublicNotice != null)
                    {
                        OnPublicNotice(
                            Rfc2812Util.UserInfoFromString(tokens[0]),
                            tokens[2],
                            CondenseStrings(tokens, 3));
                    }
                }
                else
                {
                    if (OnPrivateNotice != null)
                    {
                        OnPrivateNotice(
                            Rfc2812Util.UserInfoFromString(tokens[0]),
                            CondenseStrings(tokens, 3));
                    }
                }
                break;

            case JOIN:
                if (OnJoin != null)
                {
                    OnJoin(Rfc2812Util.UserInfoFromString(tokens[0]), RemoveLeadingColon(tokens[2]));
                }
                break;

            case PRIVMSG:
                tokens[3] = RemoveLeadingColon(tokens[3]);
                if (tokens[3] == ACTION)
                {
                    if (Rfc2812Util.IsValidChannelName(tokens[2]))
                    {
                        if (OnAction != null)
                        {
                            int last = tokens.Length - 1;
                            tokens[last] = RemoveTrailingQuote(tokens[last]);
                            OnAction(Rfc2812Util.UserInfoFromString(tokens[0]), tokens[2], CondenseStrings(tokens, 4));
                        }
                    }
                    else
                    {
                        if (OnPrivateAction != null)
                        {
                            int last = tokens.Length - 1;
                            tokens[last] = RemoveTrailingQuote(tokens[last]);
                            OnPrivateAction(Rfc2812Util.UserInfoFromString(tokens[0]), CondenseStrings(tokens, 4));
                        }
                    }
                }
                else if (channelPattern.IsMatch(tokens[2]))
                {
                    if (OnPublic != null)
                    {
                        OnPublic(Rfc2812Util.UserInfoFromString(tokens[0]), tokens[2], CondenseStrings(tokens, 3));
                    }
                }
                else
                {
                    if (OnPrivate != null)
                    {
                        OnPrivate(Rfc2812Util.UserInfoFromString(tokens[0]), CondenseStrings(tokens, 3));
                    }
                }
                break;

            case NICK:
                if (OnNick != null)
                {
                    OnNick(Rfc2812Util.UserInfoFromString(tokens[0]), RemoveLeadingColon(tokens[2]));
                }
                break;

            case PART:
                if (OnPart != null)
                {
                    OnPart(
                        Rfc2812Util.UserInfoFromString(tokens[0]),
                        tokens[2],
                        tokens.Length >= 4 ? RemoveLeadingColon(CondenseStrings(tokens, 3)) : "");
                }
                break;

            case QUIT:
                if (OnQuit != null)
                {
                    tokens[2] = RemoveLeadingColon(tokens[2]);
                    OnQuit(Rfc2812Util.UserInfoFromString(tokens[0]), CondenseStrings(tokens, 2));
                }
                break;

            case INVITE:
                if (OnInvite != null)
                {
                    OnInvite(
                        Rfc2812Util.UserInfoFromString(tokens[0]), RemoveLeadingColon(tokens[3]));
                }
                break;

            case KICK:
                if (OnKick != null)
                {
                    tokens[4] = RemoveLeadingColon(tokens[4]);
                    OnKick(Rfc2812Util.UserInfoFromString(tokens[0]), tokens[2], tokens[3], CondenseStrings(tokens, 4));
                }
                break;

            case MODE:
                if (channelPattern.IsMatch(tokens[2]))
                {
                    if (OnChannelModeChange != null)
                    {
                        UserInfo who = Rfc2812Util.UserInfoFromString(tokens[0]);
                        OnChannelModeChange(who, tokens[2]);
                    }
                }
                break;

            case KILL:
                if (OnKill != null)
                {
                    string reason = "";
                    if (tokens.Length >= 4)
                    {
                        tokens[3] = RemoveLeadingColon(tokens[3]);
                        reason    = CondenseStrings(tokens, 3);
                    }
                    OnKill(Rfc2812Util.UserInfoFromString(tokens[0]), tokens[2], reason);
                }
                break;

            default:
                if (OnError != null)
                {
                    OnError(ReplyCode.UnparseableMessage, CondenseStrings(tokens, 0));
                }
                break;
            }
        }