@@ -34,11 +34,10 @@ #import #import "IRCConnection.h" #import "IRCUser.h" -#import "IRCChannel.h" @implementation IRCConnection - init { self = [super init]; @@ -144,31 +143,30 @@ [self sendLine: @"QUIT"]; else [self sendLineWithFormat: @"QUIT :%@", reason]; } -- (void)joinChannel: (OFString*)channelName +- (void)joinChannel: (OFString*)channel { - [self sendLineWithFormat: @"JOIN %@", channelName]; + [self sendLineWithFormat: @"JOIN %@", channel]; } -- (void)leaveChannel: (IRCChannel*)channel +- (void)leaveChannel: (OFString*)channel { [self leaveChannel: channel reason: nil]; } -- (void)leaveChannel: (IRCChannel*)channel +- (void)leaveChannel: (OFString*)channel reason: (OFString*)reason { if (reason == nil) - [self sendLineWithFormat: @"PART %@", [channel name]]; + [self sendLineWithFormat: @"PART %@", channel]; else - [self sendLineWithFormat: @"PART %@ :%@", - [channel name], reason]; + [self sendLineWithFormat: @"PART %@ :%@", channel, reason]; - [channels removeObjectForKey: [channel name]]; + [channels removeObjectForKey: channel]; } - (void)sendLine: (OFString*)line { [delegate connection: self @@ -192,39 +190,26 @@ [pool release]; } - (void)sendMessage: (OFString*)msg - channel: (IRCChannel*)channel -{ - [self sendLineWithFormat: @"PRIVMSG %@ :%@", [channel name], msg]; -} - -- (void)sendMessage: (OFString*)msg - user: (OFString*)user -{ - [self sendLineWithFormat: @"PRIVMSG %@ :%@", user, msg]; -} - -- (void)sendNotice: (OFString*)notice - user: (OFString*)user -{ - [self sendLineWithFormat: @"NOTICE %@ :%@", user, notice]; -} - -- (void)sendNotice: (OFString*)notice - channel: (IRCChannel*)channel -{ - [self sendLineWithFormat: @"NOTICE %@ :%@", [channel name], notice]; -} - -- (void)kickUser: (OFString*)user - channel: (IRCChannel*)channel - reason: (OFString*)reason -{ - [self sendLineWithFormat: @"KICK %@ %@ :%@", - [channel name], user, reason]; + to: (OFString*)to +{ + [self sendLineWithFormat: @"PRIVMSG %@ :%@", to, msg]; +} + +- (void)sendNotice: (OFString*)notice + to: (OFString*)to +{ + [self sendLineWithFormat: @"NOTICE %@ :%@", to, notice]; +} + +- (void)kickUser: (OFString*)user + channel: (OFString*)channel + reason: (OFString*)reason +{ + [self sendLineWithFormat: @"KICK %@ %@ :%@", channel, user, reason]; } - (void)changeNicknameTo: (OFString*)nickname_ { [self sendLineWithFormat: @"NICK %@", nickname_]; @@ -262,42 +247,43 @@ /* JOIN */ if ([action isEqual: @"JOIN"] && [components count] == 3) { OFString *who = [components objectAtIndex: 0]; OFString *where = [components objectAtIndex: 2]; IRCUser *user; - IRCChannel *channel; + OFMutableSet *channel; who = [who substringWithRange: of_range(1, [who length] - 1)]; user = [IRCUser IRCUserWithString: who]; if ([who hasPrefix: [nickname stringByAppendingString: @"!"]]) { - channel = [IRCChannel channelWithName: where]; + channel = [OFMutableSet set]; [channels setObject: channel forKey: where]; } else channel = [channels objectForKey: where]; - [channel IRC_addUser: [user nickname]]; + [channel addObject: [user nickname]]; [delegate connection: self didSeeUser: user - joinChannel: channel]; + joinChannel: where]; return; } /* NAMES reply */ if ([action isEqual: @"353"] && [components count] >= 6) { - IRCChannel *channel; + OFString *where; + OFMutableSet *channel; OFArray *users; size_t pos; OFEnumerator *enumerator; OFString *user; - channel = [channels - objectForKey: [components objectAtIndex: 4]]; - if (channel == nil) { + where = [components objectAtIndex: 4]; + + if ((channel = [channels objectForKey: where]) == nil) { /* We did not request that */ return; } pos = [[components objectAtIndex: 0] length] + @@ -315,25 +301,25 @@ if ([user hasPrefix: @"@"] || [user hasPrefix: @"+"] || [user hasPrefix: @"%"] || [user hasPrefix: @"*"]) user = [user substringWithRange: of_range(1, [user length] - 1)]; - [channel IRC_addUser: user]; + [channel addObject: user]; } [delegate connection: self - didReceiveNamesForChannel: channel]; + didReceiveNamesForChannel: where]; return; } /* PART */ if ([action isEqual: @"PART"] && [components count] >= 3) { OFString *who = [components objectAtIndex: 0]; OFString *where = [components objectAtIndex: 2]; IRCUser *user; - IRCChannel *channel; + OFMutableSet *channel; OFString *reason = nil; size_t pos = [who length] + 1 + [[components objectAtIndex: 1] length] + 1 + [where length]; who = [who substringWithRange: of_range(1, [who length] - 1)]; @@ -342,15 +328,15 @@ if ([components count] > 3) reason = [line substringWithRange: of_range(pos + 2, [line length] - pos - 2)]; - [channel IRC_removeUser: [user nickname]]; + [channel removeObject: [user nickname]]; [delegate connection: self didSeeUser: user - leaveChannel: channel + leaveChannel: where reason: reason]; return; } @@ -358,11 +344,11 @@ if ([action isEqual: @"KICK"] && [components count] >= 4) { OFString *who = [components objectAtIndex: 0]; OFString *where = [components objectAtIndex: 2]; OFString *whom = [components objectAtIndex: 3]; IRCUser *user; - IRCChannel *channel; + OFMutableSet *channel; OFString *reason = nil; size_t pos = [who length] + 1 + [[components objectAtIndex: 1] length] + 1 + [where length] + 1 + [whom length]; @@ -372,16 +358,16 @@ if ([components count] > 4) reason = [line substringWithRange: of_range(pos + 2, [line length] - pos - 2)]; - [channel IRC_removeUser: [user nickname]]; + [channel removeObject: [user nickname]]; [delegate connection: self didSeeUser: user kickUser: whom - channel: channel + channel: where reason: reason]; return; } @@ -391,22 +377,22 @@ IRCUser *user; OFString *reason = nil; size_t pos = [who length] + 1 + [[components objectAtIndex: 1] length]; OFEnumerator *enumerator; - IRCChannel *channel; + OFMutableSet *channel; who = [who substringWithRange: of_range(1, [who length] - 1)]; user = [IRCUser IRCUserWithString: who]; if ([components count] > 2) reason = [line substringWithRange: of_range(pos + 2, [line length] - pos - 2)]; - enumerator = [channels keyEnumerator]; + enumerator = [channels objectEnumerator]; while ((channel = [enumerator nextObject]) != nil) - [channel IRC_removeUser: [user nickname]]; + [channel removeObject: [user nickname]]; [delegate connection: self didSeeUserQuit: user reason: reason]; @@ -417,11 +403,11 @@ if ([action isEqual: @"NICK"] && [components count] == 3) { OFString *who = [components objectAtIndex: 0]; OFString *newNickname = [components objectAtIndex: 2]; IRCUser *user; OFEnumerator *enumerator; - IRCChannel *channel; + OFMutableSet *channel; who = [who substringWithRange: of_range(1, [who length] - 1)]; newNickname = [newNickname substringWithRange: of_range(1, [newNickname length] - 1)]; @@ -432,13 +418,13 @@ nickname = [[user nickname] copy]; } enumerator = [channels keyEnumerator]; while ((channel = [enumerator nextObject]) != nil) { - if ([[channel users] containsObject: [user nickname]]) { - [channel IRC_removeUser: [user nickname]]; - [channel IRC_addUser: newNickname]; + if ([channel containsObject: [user nickname]]) { + [channel removeObject: [user nickname]]; + [channel addObject: newNickname]; } } [delegate connection: self didSeeUser: user @@ -460,20 +446,16 @@ of_range(1, [from length] - 1)]; msg = [line substringWithRange: of_range(pos + 2, [line length] - pos - 2)]; user = [IRCUser IRCUserWithString: from]; - if (![to isEqual: nickname]) { - IRCChannel *channel; - - channel = [channels objectForKey: to]; - + if (![to isEqual: nickname]) [delegate connection: self didReceiveMessage: msg - user: user - channel: channel]; - } else + channel: to + user: user]; + else [delegate connection: self didReceivePrivateMessage: msg user: user]; return; @@ -498,20 +480,16 @@ return; } user = [IRCUser IRCUserWithString: from]; - if (![to isEqual: nickname]) { - IRCChannel *channel; - - channel = [channels objectForKey: to]; - + if (![to isEqual: nickname]) [delegate connection: self didReceiveNotice: notice - user: user - channel: channel]; - } else + channel: to + user: user]; + else [delegate connection: self didReceiveNotice: notice user: user]; return; @@ -565,10 +543,15 @@ { [sock asyncReadLineWithTarget: self selector: @selector(connection:didReceiveLine: exception:)]; } + +- (OFSet*)usersInChannel: (OFString*)channel +{ + return [[[channels objectForKey: channel] copy] autorelease]; +} - (void)dealloc { [sock release]; [server release]; @@ -596,17 +579,17 @@ { } - (void)connection: (IRCConnection*)connection didSeeUser: (IRCUser*)user - joinChannel: (IRCChannel*)channel + joinChannel: (OFString*)channel { } - (void)connection: (IRCConnection*)connection didSeeUser: (IRCUser*)user - leaveChannel: (IRCChannel*)channel + leaveChannel: (OFString*)channel reason: (OFString*)reason { } - (void)connection: (IRCConnection*)connection @@ -616,11 +599,11 @@ } - (void)connection: (IRCConnection*)connection didSeeUser: (IRCUser*)user kickUser: (OFString*)kickedUser - channel: (IRCChannel*)channel + channel: (OFString*)channel reason: (OFString*)reason { } - (void)connection: (IRCConnection*)connection @@ -629,12 +612,12 @@ { } - (void)connection: (IRCConnection*)connection didReceiveMessage: (OFString*)msg - fromUser: (IRCUser*)user - channel: (IRCChannel*)channel + channel: (OFString*)channel + user: (IRCUser*)user { } - (void)connection: (IRCConnection*)connection didReceivePrivateMessage: (OFString*)msg @@ -642,25 +625,25 @@ { } - (void)connection: (IRCConnection*)connection didReceiveNotice: (OFString*)notice + channel: (OFString*)channel user: (IRCUser*)user { } - (void)connection: (IRCConnection*)connection didReceiveNotice: (OFString*)notice user: (IRCUser*)user - channel: (IRCChannel*)channel { } - (void)connection: (IRCConnection*)connection - didReceiveNamesForChannel: (IRCChannel*)channel + didReceiveNamesForChannel: (OFString*)channel { } - (void)connectionWasClosed: (IRCConnection*)connection { } @end