private void ParseReply(string[] tokens) { ReplyCode code = (ReplyCode)int.Parse(tokens[1], CultureInfo.InvariantCulture); tokens[3] = RemoveLeadingColon(tokens[3]); switch (code) { //Messages sent upon successful registration case ReplyCode.RPL_WELCOME: case ReplyCode.RPL_YOURESERVICE: if (OnRegistered != null) { OnRegistered(); } break; case ReplyCode.RPL_MOTDSTART: case ReplyCode.RPL_MOTD: if (OnMotd != null) { OnMotd(CondenseStrings(tokens, 3), false); } break; case ReplyCode.RPL_ENDOFMOTD: if (OnMotd != null) { OnMotd(CondenseStrings(tokens, 3), true); } break; case ReplyCode.RPL_ISON: if (OnIson != null) { OnIson(tokens[3]); } break; case ReplyCode.RPL_NAMREPLY: if (OnNames != null) { tokens[5] = RemoveLeadingColon(tokens[5]); int numberOfUsers = tokens.Length - 5; string[] users = new string[numberOfUsers]; Array.Copy(tokens, 5, users, 0, numberOfUsers); OnNames(tokens[4], users, false); } break; case ReplyCode.RPL_ENDOFNAMES: if (OnNames != null) { OnNames(tokens[3], new string[0], true); } break; case ReplyCode.RPL_LIST: if (OnList != null) { tokens[5] = RemoveLeadingColon(tokens[5]); OnList( tokens[3], int.Parse(tokens[4], CultureInfo.InvariantCulture), CondenseStrings(tokens, 5), false); } break; case ReplyCode.RPL_LISTEND: if (OnList != null) { OnList("", 0, "", true); } break; case ReplyCode.ERR_NICKNAMEINUSE: case ReplyCode.ERR_NICKCOLLISION: if (OnNickError != null) { tokens[4] = RemoveLeadingColon(tokens[4]); OnNickError(tokens[3], CondenseStrings(tokens, 4)); } break; case ReplyCode.RPL_NOTOPIC: if (OnError != null) { OnError(code, CondenseStrings(tokens, 3)); } break; case ReplyCode.RPL_TOPIC: if (OnTopicRequest != null) { tokens[4] = RemoveLeadingColon(tokens[4]); OnTopicRequest(tokens[3], CondenseStrings(tokens, 4)); } break; case ReplyCode.RPL_INVITING: if (OnInviteSent != null) { OnInviteSent(tokens[3], tokens[4]); } break; case ReplyCode.RPL_AWAY: if (OnAway != null) { OnAway(tokens[3], RemoveLeadingColon(CondenseStrings(tokens, 4))); } break; case ReplyCode.RPL_WHOREPLY: if (OnWho != null) { UserInfo user = new UserInfo(tokens[7], tokens[4], tokens[5]); OnWho( user, tokens[3], tokens[6], tokens[8], int.Parse(RemoveLeadingColon(tokens[9]), CultureInfo.InvariantCulture), tokens[10], false); } break; case ReplyCode.RPL_ENDOFWHO: if (OnWho != null) { OnWho(UserInfo.Empty, "", "", "", 0, "", true); } break; case ReplyCode.RPL_WHOISUSER: UserInfo whoUser = new UserInfo(tokens[3], tokens[4], tokens[5]); WhoisInfo whoisInfo = LookupInfo(whoUser.Nick); whoisInfo.userInfo = whoUser; tokens[7] = RemoveLeadingColon(tokens[7]); whoisInfo.realName = CondenseStrings(tokens, 7); break; case ReplyCode.RPL_WHOISCHANNELS: WhoisInfo whoisChannelInfo = LookupInfo(tokens[3]); tokens[4] = RemoveLeadingColon(tokens[4]); int numberOfChannels = tokens.Length - 4; string[] channels = new String[numberOfChannels]; Array.Copy(tokens, 4, channels, 0, numberOfChannels); whoisChannelInfo.SetChannels(channels); break; case ReplyCode.RPL_WHOISSERVER: WhoisInfo whoisServerInfo = LookupInfo(tokens[3]); whoisServerInfo.ircServer = tokens[4]; tokens[5] = RemoveLeadingColon(tokens[5]); whoisServerInfo.serverDescription = CondenseStrings(tokens, 5); break; case ReplyCode.RPL_WHOISOPERATOR: WhoisInfo whoisOpInfo = LookupInfo(tokens[3]); whoisOpInfo.isOperator = true; break; case ReplyCode.RPL_WHOISIDLE: WhoisInfo whoisIdleInfo = LookupInfo(tokens[3]); whoisIdleInfo.idleTime = long.Parse(tokens[5], CultureInfo.InvariantCulture); break; case ReplyCode.RPL_ENDOFWHOIS: string nick = tokens[3]; WhoisInfo whoisEndInfo = LookupInfo(nick); if (OnWhois != null) { OnWhois(whoisEndInfo); } whoisInfos.Remove(nick); break; case ReplyCode.RPL_WHOWASUSER: if (OnWhowas != null) { UserInfo whoWasUser = new UserInfo(tokens[3], tokens[4], tokens[5]); tokens[7] = RemoveLeadingColon(tokens[7]); OnWhowas(whoWasUser, CondenseStrings(tokens, 7), false); } break; case ReplyCode.RPL_ENDOFWHOWAS: if (OnWhowas != null) { OnWhowas(UserInfo.Empty, "", true); } break; case ReplyCode.RPL_UMODEIS: if (OnUserModeRequest != null) { //First drop the '+' string chars = tokens[3].Substring(1); UserMode[] modes = Rfc2812Util.UserModesToArray(chars); OnUserModeRequest(modes); } break; case ReplyCode.RPL_CHANNELMODEIS: if (OnChannelModeRequest != null) { try { ChannelModeInfo[] modes = ChannelModeInfo.ParseModes(tokens, 4); OnChannelModeRequest(tokens[3], modes); } catch (Exception) { if (OnError != null) { OnError(ReplyCode.UnparseableMessage, CondenseStrings(tokens, 0)); } } } break; case ReplyCode.RPL_BANLIST: if (OnChannelList != null) { OnChannelList(tokens[3], ChannelMode.Ban, tokens[4], Rfc2812Util.UserInfoFromString(tokens[5]), Convert.ToInt64(tokens[6], CultureInfo.InvariantCulture), false); } break; case ReplyCode.RPL_ENDOFBANLIST: if (OnChannelList != null) { OnChannelList(tokens[3], ChannelMode.Ban, "", UserInfo.Empty, 0, true); } break; case ReplyCode.RPL_INVITELIST: if (OnChannelList != null) { OnChannelList(tokens[3], ChannelMode.Invitation, tokens[4], Rfc2812Util.UserInfoFromString(tokens[5]), Convert.ToInt64(tokens[6]), false); } break; case ReplyCode.RPL_ENDOFINVITELIST: if (OnChannelList != null) { OnChannelList(tokens[3], ChannelMode.Invitation, "", UserInfo.Empty, 0, true); } break; case ReplyCode.RPL_EXCEPTLIST: if (OnChannelList != null) { OnChannelList(tokens[3], ChannelMode.Exception, tokens[4], Rfc2812Util.UserInfoFromString(tokens[5]), Convert.ToInt64(tokens[6]), false); } break; case ReplyCode.RPL_ENDOFEXCEPTLIST: if (OnChannelList != null) { OnChannelList(tokens[3], ChannelMode.Exception, "", UserInfo.Empty, 0, true); } break; case ReplyCode.RPL_UNIQOPIS: if (OnChannelList != null) { OnChannelList(tokens[3], ChannelMode.ChannelCreator, tokens[4], UserInfo.Empty, 0, true); } break; case ReplyCode.RPL_VERSION: if (OnVersion != null) { OnVersion(CondenseStrings(tokens, 3)); } break; case ReplyCode.RPL_TIME: if (OnTime != null) { OnTime(CondenseStrings(tokens, 3)); } break; case ReplyCode.RPL_INFO: if (OnInfo != null) { OnInfo(CondenseStrings(tokens, 3), false); } break; case ReplyCode.RPL_ENDOFINFO: if (OnInfo != null) { OnInfo(CondenseStrings(tokens, 3), true); } break; case ReplyCode.RPL_ADMINME: case ReplyCode.RPL_ADMINLOC1: case ReplyCode.RPL_ADMINLOC2: case ReplyCode.RPL_ADMINEMAIL: if (OnAdmin != null) { OnAdmin(RemoveLeadingColon(CondenseStrings(tokens, 3))); } break; case ReplyCode.RPL_LUSERCLIENT: case ReplyCode.RPL_LUSEROP: case ReplyCode.RPL_LUSERUNKNOWN: case ReplyCode.RPL_LUSERCHANNELS: case ReplyCode.RPL_LUSERME: if (OnLusers != null) { OnLusers(RemoveLeadingColon(CondenseStrings(tokens, 3))); } break; case ReplyCode.RPL_LINKS: if (OnLinks != null) { OnLinks(tokens[3], //mask tokens[4], //hostname int.Parse(RemoveLeadingColon(tokens[5]), CultureInfo.InvariantCulture), //hopcount CondenseStrings(tokens, 6), false); } break; case ReplyCode.RPL_ENDOFLINKS: if (OnLinks != null) { OnLinks(String.Empty, String.Empty, -1, String.Empty, true); } break; case ReplyCode.RPL_STATSLINKINFO: case ReplyCode.RPL_STATSCOMMANDS: case ReplyCode.RPL_STATSUPTIME: case ReplyCode.RPL_STATSOLINE: if (OnStats != null) { OnStats(GetQueryType(code), RemoveLeadingColon(CondenseStrings(tokens, 3)), false); } break; case ReplyCode.RPL_ENDOFSTATS: if (OnStats != null) { OnStats(Rfc2812Util.CharToStatsQuery(tokens[3][0]), RemoveLeadingColon(CondenseStrings(tokens, 4)), true); } break; default: HandleDefaultReply(code, tokens); break; } }