Changeset 3768

Show
Ignore:
Timestamp:
11/23/07 01:18:39 (9 months ago)
Author:
timothy
Message:

Fix for servers that send multiple mode prefixes in the NAMES message. Patch by zetawolf, with tweaks by me. #642 #814

Files:

Legend:

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

    r3722 r3768  
    11#import "MVChatConnection.h" 
    22#import "MVChatConnectionPrivate.h" 
     3#import "MVChatRoom.h" 
    34 
    45@class AsyncSocket; 
    56@class MVChatUser; 
    6 @class MVChatRoom; 
    77@class MVFileTransfer; 
    88 
     
    6666- (void) _resetSupportedFeatures; 
    6767 
     68- (MVChatRoomMemberMode) _modeForNicknamePrefixCharacter:(unichar) character; 
     69- (MVChatRoomMemberMode) _stripModePrefixesFromNickname:(NSString **) nickname; 
     70 
    6871- (NSString *) _newStringWithBytes:(const char *) bytes length:(unsigned) length; 
    6972- (NSString *) _stringFromPossibleData:(id) input; 
  • trunk/Chat Core/MVIRCChatConnection.m

    r3763 r3768  
    13001300        return input; 
    13011301} 
     1302 
     1303#pragma mark - 
     1304 
     1305- (MVChatRoomMemberMode) _modeForNicknamePrefixCharacter:(unichar) character { 
     1306        switch( character ) { 
     1307                case '+': return MVChatRoomMemberVoicedMode; 
     1308                case '%': return MVChatRoomMemberHalfOperatorMode; 
     1309                case '@': return MVChatRoomMemberOperatorMode; 
     1310                case '&': return MVChatRoomMemberAdministratorMode; 
     1311                case '!': return MVChatRoomMemberAdministratorMode; 
     1312                case '*': return MVChatRoomMemberFounderMode; 
     1313                case '~': return MVChatRoomMemberFounderMode; 
     1314                case '.': return MVChatRoomMemberFounderMode; 
     1315        } 
     1316 
     1317        return MVChatRoomMemberNoModes; 
     1318} 
     1319 
     1320- (MVChatRoomMemberMode) _stripModePrefixesFromNickname:(NSString **) nicknamePtr { 
     1321        NSString *nickname = *nicknamePtr; 
     1322        MVChatRoomMemberMode modes = MVChatRoomMemberNoModes; 
     1323        NSMutableDictionary *prefixes = [_serverInformation objectForKey:@"roomMemberPrefixTable"]; 
     1324 
     1325        unsigned i = 0; 
     1326        unsigned length = [nickname length]; 
     1327        for( i = 0; i < length; ++i ) { 
     1328                if( [prefixes count] ) { 
     1329                        NSNumber *prefix = [prefixes objectForKey:[NSString stringWithFormat:@"%c", [nickname characterAtIndex:i]]]; 
     1330                        if( prefix ) modes |= [prefix unsignedLongValue]; 
     1331                        else break; 
     1332                } else { 
     1333                        MVChatRoomMemberMode mode = [self _modeForNicknamePrefixCharacter:[nickname characterAtIndex:i]]; 
     1334                        if( mode != MVChatRoomMemberNoModes ) modes |= mode; 
     1335                        else break; 
     1336                } 
     1337        } 
     1338 
     1339        if( i ) *nicknamePtr = [nickname substringFromIndex:i]; 
     1340        return modes; 
     1341} 
    13021342@end 
    13031343 
     
    14321472                                        unsigned i = 0; 
    14331473                                        for( i = 0; i < length; i++ ) { 
    1434                                                 MVChatRoomMemberMode mode = MVChatRoomMemberNoModes; 
    1435                                                 switch( [prefixes characterAtIndex:i] ) { 
    1436                                                         case '+': mode = MVChatRoomMemberVoicedMode; break; 
    1437                                                         case '%': mode = MVChatRoomMemberHalfOperatorMode; break; 
    1438                                                         case '@': mode = MVChatRoomMemberOperatorMode; break; 
    1439                                                         case '&': mode = MVChatRoomMemberAdministratorMode; break; 
    1440                                                         case '!': mode = MVChatRoomMemberAdministratorMode; break; 
    1441                                                         case '*': mode = MVChatRoomMemberFounderMode; break; 
    1442                                                         case '~': mode = MVChatRoomMemberFounderMode; break; 
    1443                                                         case '.': mode = MVChatRoomMemberFounderMode; break; 
    1444                                                         default: break; 
    1445                                                 } 
    1446  
     1474                                                MVChatRoomMemberMode mode = [self _modeForNicknamePrefixCharacter:[prefixes characterAtIndex:i]]; 
    14471475                                                if( mode != MVChatRoomMemberNoModes ) { 
    14481476                                                        NSString *key = [[NSString allocWithZone:nil] initWithFormat:@"%c", [prefixes characterAtIndex:i]]; 
     
    24972525                                if( ! [memberName length] ) break; 
    24982526 
    2499                                 MVChatRoomMemberMode modes = MVChatRoomMemberNoModes; 
    2500                                 NSMutableDictionary *prefixes = [_serverInformation objectForKey:@"roomMemberPrefixTable"]; 
    2501                                 if( [prefixes count] ) { 
    2502                                         NSString *key = [[NSString allocWithZone:nil] initWithFormat:@"%c", [memberName characterAtIndex:0]]; 
    2503                                         modes = [[prefixes objectForKey:key] unsignedLongValue]; 
    2504                                         [key release]; 
    2505                                 } else { 
    2506                                         switch( [memberName characterAtIndex:0] ) { 
    2507                                                 case '+': modes = MVChatRoomMemberVoicedMode; break; 
    2508                                                 case '@': modes = MVChatRoomMemberOperatorMode; break; 
    2509                                                 default: break; 
    2510                                         } 
    2511                                 } 
    2512  
    2513                                 if( modes != MVChatRoomMemberNoModes ) 
    2514                                         memberName = [memberName substringFromIndex:1]; 
    2515  
     2527                                MVChatRoomMemberMode modes = [self _stripModePrefixesFromNickname:&memberName]; 
    25162528                                MVChatUser *member = [self chatUserWithUniqueIdentifier:memberName]; 
    25172529                                [room _addMemberUser:member];