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); }
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"); } }
/// <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; } }