private void _Event_RPL_WHOREPLY(IrcMessageData ircdata)
{
string channel = ircdata.Channel;
string ident = ircdata.RawMessageArray[4];
string host = ircdata.RawMessageArray[5];
string server = ircdata.RawMessageArray[6];
string nick = ircdata.RawMessageArray[7];
string usermode = ircdata.RawMessageArray[8];
string realname = ircdata.Message.Substring(2);
int hopcount = 0;
string temp = ircdata.RawMessageArray[9].Substring(1);
try {
hopcount = int.Parse(temp);
} catch (FormatException) {
#if LOG4NET
Logger.MessageParser.Warn("couldn't parse (as int): '"+temp+"'");
#endif
}
bool op = false;
bool voice = false;
bool ircop = false;
bool away = false;
int usermodelength = usermode.Length;
for (int i = 0; i < usermodelength; i++) {
switch (usermode[i]) {
case 'H':
away = false;
break;
case 'G':
away = true;
break;
case '@':
op = true;
break;
case '+':
voice = true;
break;
case '*':
ircop = true;
break;
}
}
if (ActiveChannelSyncing &&
IsJoined(channel)) {
// checking the irc and channel user I only do for sanity!
// according to RFC they must be known to us already via RPL_NAMREPLY
// psyBNC is not very correct with this... maybe other bouncers too
IrcUser ircuser = GetIrcUser(nick);
ChannelUser channeluser = GetChannelUser(channel, nick);
#if LOG4NET
if (ircuser == null) {
Logger.ChannelSyncing.Error("GetIrcUser("+nick+") returned null in _Event_WHOREPLY! Ignoring...");
}
#endif
#if LOG4NET
if (channeluser == null) {
Logger.ChannelSyncing.Error("GetChannelUser("+nick+") returned null in _Event_WHOREPLY! Ignoring...");
}
#endif
if (ircuser != null) {
#if LOG4NET
Logger.ChannelSyncing.Debug("updating userinfo (from whoreply) for user: "+nick+" channel: "+channel);
#endif
ircuser.Ident = ident;
ircuser.Host = host;
ircuser.Server = server;
ircuser.Nick = nick;
ircuser.HopCount = hopcount;
ircuser.Realname = realname;
ircuser.IsAway = away;
ircuser.IsIrcOp = ircop;
switch (channel[0]) {
case '#':
case '!':
case '&':
case '+':
// this channel may not be where we are joined!
// see RFC 1459 and RFC 2812, it must return a channelname
// we use this channel info when possible...
if (channeluser != null) {
channeluser.IsOp = op;
channeluser.IsVoice = voice;
}
break;
}
}
}
if (OnWho != null) {
OnWho(this, new WhoEventArgs(ircdata, channel, nick, ident, host, realname, away, op, voice, ircop, server, hopcount));
}
}