From b0ef070c326b41a3650bc116fa423eafbc293cbf Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Sat, 10 Sep 2011 13:40:48 +0000 Subject: [PATCH] Add support for parsing KICK. FossilOrigin-Name: 6f062f71896107c8ddd1d66fd649f6e7d15e0b6704072eb28bc9ba00582bd4e8 --- src/IRCConnection.h | 5 +++++ src/IRCConnection.m | 33 +++++++++++++++++++++++++++++++++ tests/test.m | 9 +++++++++ 3 files changed, 47 insertions(+) diff --git a/src/IRCConnection.h b/src/IRCConnection.h index b82844d..02c7149 100644 --- a/src/IRCConnection.h +++ b/src/IRCConnection.h @@ -46,6 +46,11 @@ - (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; diff --git a/src/IRCConnection.m b/src/IRCConnection.m index c10273f..f1062d7 100644 --- a/src/IRCConnection.m +++ b/src/IRCConnection.m @@ -247,6 +247,39 @@ 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) { OFString *who = [split objectAtIndex: 0]; diff --git a/tests/test.m b/tests/test.m index 34f77f9..52aef63 100644 --- a/tests/test.m +++ b/tests/test.m @@ -80,6 +80,15 @@ OF_APPLICATION_DELEGATE(TestApp) 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