Changeset 3340

Show
Ignore:
Timestamp:
08/22/06 01:02:20 (2 years ago)
Author:
timothy
Message:

Parse nicknames in the names reply per the IRC spec. Skip all non-alpha characters at the beginning, since these are the prefixes added by the server. This fixes parts of #814 and #642, but we can't support these non-standard perfixes better until I know what they mean.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Chat Core/MVIRCChatConnection.m

    r3339 r3340  
    20902090                if( room && ! [room _namesSynced] ) { 
    20912091                        NSAutoreleasePool *pool = [[NSAutoreleasePool allocWithZone:nil] init]; 
     2092                        NSMutableDictionary *prefixes = [_serverInformation objectForKey:@"roomMemberPrefixTable"]; 
    20922093                        NSString *names = [self _stringFromPossibleData:[parameters objectAtIndex:3]]; 
    20932094                        NSArray *members = [names componentsSeparatedByString:@" "]; 
     
    20982099                                if( ! [memberName length] ) break; 
    20992100 
    2100                                 MVChatRoomMemberMode modes = MVChatRoomMemberNoModes; 
    2101                                 if( _serverInformation ) { 
    2102                                         NSMutableDictionary *prefixes = [_serverInformation objectForKey:@"roomMemberPrefixTable"]; 
    2103                                         NSString *key = [[NSString allocWithZone:nil] initWithFormat:@"%c", [memberName characterAtIndex:0]]; 
    2104                                         modes = [[prefixes objectForKey:key] unsignedLongValue]; 
    2105                                         [key release]; 
    2106                                 } else { 
    2107                                         switch( [memberName characterAtIndex:0] ) { 
    2108                                                 case '+': modes = MVChatRoomMemberVoicedMode; break; 
    2109                                                 case '@': modes = MVChatRoomMemberOperatorMode; break; 
    2110                                                 default: break; 
    2111                                         } 
     2101                                MVChatRoomMemberMode mode = MVChatRoomMemberNoModes; 
     2102 
     2103                                unsigned int i = 0; 
     2104                                unsigned int length = [memberName length]; 
     2105                                for( i = 0; i < length; i++ ) { 
     2106                                        unichar chr = [memberName characterAtIndex:i]; 
     2107                                        if( ! isalpha( chr ) ) { 
     2108                                                if( prefixes ) { 
     2109                                                        NSString *key = [[NSString allocWithZone:nil] initWithFormat:@"%c", chr]; 
     2110                                                        mode = [[prefixes objectForKey:key] unsignedLongValue]; 
     2111                                                        [key release]; 
     2112                                                } else { 
     2113                                                        switch( chr ) { 
     2114                                                                case '+': mode = MVChatRoomMemberVoicedMode; break; 
     2115                                                                case '@': mode = MVChatRoomMemberOperatorMode; break; 
     2116                                                                default: break; 
     2117                                                        } 
     2118                                                } 
     2119                                        } else break; 
    21122120                                } 
    21132121 
    2114                                 if( modes != MVChatRoomMemberNoModes ) 
    2115                                         memberName = [memberName substringFromIndex:1]; 
     2122                                if( i ) memberName = [memberName substringFromIndex:i]; 
    21162123 
    21172124                                MVChatUser *member = [self chatUserWithUniqueIdentifier:memberName]; 
    21182125                                [room _addMemberUser:member]; 
    2119                                 [room _setModes:modes forMemberUser:member]; 
     2126                                [room _setModes:mode forMemberUser:member]; 
    21202127                        } 
    21212128