Index: src/IRCConnection.h ================================================================== --- src/IRCConnection.h +++ src/IRCConnection.h @@ -45,10 +45,15 @@ withReason: (OFString*)reason; - (void)connection: (IRCConnection*)connection didSeeUser: (IRCUser*)user changeNicknameTo: (OFString*)nickname; - (void)connection: (IRCConnection*)connection + didSeeUser: (IRCUser*)user + kickUser: (OFString*)kickedUser + fromChannel: (IRCChannel*)channel + withReason: (OFString*)reason; +- (void)connection: (IRCConnection*)connection didSeeUserQuit: (IRCUser*)user withReason: (OFString*)reason; - (void)connection: (IRCConnection*)connection didReceiveMessage: (OFString*)msg fromUser: (IRCUser*)user Index: src/IRCConnection.m ================================================================== --- src/IRCConnection.m +++ src/IRCConnection.m @@ -242,10 +242,43 @@ [delegate connection: self didSeeUser: user leaveChannel: channel withReason: reason]; + continue; + } + + /* KICK */ + if ([action isEqual: @"KICK"] && split.count >= 4) { + OFString *who = [split objectAtIndex: 0]; + OFString *where = [split objectAtIndex: 2]; + OFString *whom = [split objectAtIndex: 3]; + IRCUser *user; + IRCChannel *channel; + OFString *reason = nil; + size_t pos = who.length + 1 + + [[split objectAtIndex: 1] length] + 1 + + where.length + 1 + whom.length; + + who = [who substringWithRange: + of_range(1, who.length - 1)]; + user = [IRCUser IRCUserWithString: who]; + channel = [channels objectForKey: where]; + + if (split.count > 4) + reason = [line substringWithRange: + of_range(pos + 2, line.length - pos - 2)]; + + if ([delegate respondsToSelector: + @selector(connection:didSeeUser:kickUser: + fromChannel:withReason:)]) + [delegate connection: self + didSeeUser: user + kickUser: whom + fromChannel: channel + withReason: reason]; + continue; } /* QUIT */ if ([action isEqual: @"QUIT"] && split.count >= 2) { Index: tests/test.m ================================================================== --- tests/test.m +++ tests/test.m @@ -77,10 +77,19 @@ leaveChannel: (IRCChannel*)channel withReason: (OFString*)reason { of_log(@"%@ left %@ (%@).", user, channel, reason); } + +- (void)connection: (IRCConnection*)connection + didSeeUser: (IRCUser*)user + kickUser: (OFString*)kickedUser + fromChannel: (IRCChannel*)channel + withReason: (OFString*)reason +{ + of_log(@"%@ kicked %@ from %@: %@", user, kickedUser, channel, reason); +} - (void)connection: (IRCConnection*)connection didSeeUserQuit: (IRCUser*)user withReason: (OFString*)reason {