Changeset 3228

Show
Ignore:
Timestamp:
05/06/06 14:42:51 (2 years ago)
Author:
timothy
Message:

More support for different modes. If a server does not support a mode we will not show it in the context menu. Like freenode dosen't support half-operator, so it will no longer show up in the menu if you are a operator.

Files:

Legend:

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

    r3190 r3228  
    3131_MVChatRoomKickedNotification 
    3232_MVChatRoomInvitedNotification 
     33_MVChatRoomMemberQuietedFeature 
     34_MVChatRoomMemberVoicedFeature 
     35_MVChatRoomMemberHalfOperatorFeature 
     36_MVChatRoomMemberOperatorFeature 
     37_MVChatRoomMemberAdministratorFeature 
     38_MVChatRoomMemberFounderFeature 
    3339_MVChatRoomMemberUsersSyncedNotification 
    3440_MVChatRoomBannedUsersSyncedNotification 
  • trunk/Chat Core/MVChatRoom.h

    r3224 r3228  
    2121        MVChatRoomMemberFounderMode = 1 << 5 
    2222} MVChatRoomMemberMode; 
     23 
     24extern NSString *MVChatRoomMemberQuietedFeature; 
     25extern NSString *MVChatRoomMemberVoicedFeature; 
     26extern NSString *MVChatRoomMemberHalfOperatorFeature; 
     27extern NSString *MVChatRoomMemberOperatorFeature; 
     28extern NSString *MVChatRoomMemberAdministratorFeature; 
     29extern NSString *MVChatRoomMemberFounderFeature; 
    2330 
    2431extern NSString *MVChatRoomJoinedNotification; 
  • trunk/Chat Core/MVChatRoom.m

    r3150 r3228  
    77#import "NSDataAdditions.h" 
    88#import "NSNotificationAdditions.h" 
     9 
     10NSString *MVChatRoomMemberQuietedFeature = @"MVChatRoomMemberQuietedFeature"; 
     11NSString *MVChatRoomMemberVoicedFeature = @"MVChatRoomMemberVoicedFeature"; 
     12NSString *MVChatRoomMemberHalfOperatorFeature = @"MVChatRoomMemberHalfOperatorFeature"; 
     13NSString *MVChatRoomMemberOperatorFeature = @"MVChatRoomMemberOperatorFeature"; 
     14NSString *MVChatRoomMemberAdministratorFeature = @"MVChatRoomMemberAdministratorFeature"; 
     15NSString *MVChatRoomMemberFounderFeature = @"MVChatRoomMemberFounderFeature"; 
    916 
    1017NSString *MVChatRoomJoinedNotification = @"MVChatRoomJoinedNotification"; 
  • trunk/Chat Core/MVIRCChatConnection.h

    r3224 r3228  
    1919        NSMutableSet *_pendingWhoisUsers; 
    2020        NSMutableSet *_fileTransfers; 
     21        NSMutableSet *_supportedFeatures; 
    2122        NSMutableDictionary *_serverInformation; 
    2223        NSString *_server; 
     
    6566- (void) _whoisNextScheduledUser; 
    6667 
     68- (void) _resetSupportedFeatures; 
     69 
    6770- (NSString *) _stringFromPossibleData:(id) input; 
    6871@end 
  • trunk/Chat Core/MVIRCChatConnection.m

    r3227 r3228  
    9191                _realName = [NSFullUserName() retain]; 
    9292                _threadWaitLock = [[NSConditionLock allocWithZone:nil] initWithCondition:0]; 
     93                _supportedFeatures = [[NSMutableSet allocWithZone:nil] initWithCapacity:10]; 
     94                [self _resetSupportedFeatures]; 
    9395        } 
    9496 
     
    126128        [_roomPrefixes release]; 
    127129        [_serverInformation release]; 
     130        [_supportedFeatures release]; 
    128131 
    129132        _chatConnection = nil; 
     
    146149        _roomPrefixes = nil; 
    147150        _serverInformation = nil; 
     151        _supportedFeatures = nil; 
    148152 
    149153        [super dealloc]; 
     
    161165 
    162166- (NSSet *) supportedFeatures { 
    163         return nil; 
     167        @synchronized( _supportedFeatures ) { 
     168                return [NSSet setWithSet:_supportedFeatures]; 
     169        } return nil; 
     170
     171 
     172- (BOOL) supportsFeature:(NSString *) key { 
     173        NSParameterAssert( key != nil ); 
     174        @synchronized( _supportedFeatures ) { 
     175                return [_supportedFeatures containsObject:key]; 
     176        } return NO; 
    164177} 
    165178 
     
    182195 
    183196        [self _resetSendQueueInterval]; 
     197        [self _resetSupportedFeatures]; 
    184198 
    185199        [self _willConnect]; // call early so other code has a chance to change our info 
     
    10331047} 
    10341048 
     1049- (void) _resetSupportedFeatures { 
     1050        @synchronized( _supportedFeatures ) { 
     1051                [_supportedFeatures removeAllObjects]; 
     1052 
     1053                // all server should support these features per RFC 1459 
     1054                [_supportedFeatures addObject:MVChatRoomMemberVoicedFeature]; 
     1055                [_supportedFeatures addObject:MVChatRoomMemberOperatorFeature]; 
     1056        } 
     1057} 
     1058 
    10351059#pragma mark - 
    10361060 
     
    12641288                                        [scanner scanString:@")" intoString:NULL]; 
    12651289 
     1290                                        @synchronized( _supportedFeatures ) { 
     1291                                                // remove these in case the server does not support them when we parse the modes 
     1292                                                [_supportedFeatures removeObject:MVChatRoomMemberVoicedFeature]; 
     1293                                                [_supportedFeatures removeObject:MVChatRoomMemberOperatorFeature]; 
     1294                                        } 
     1295 
    12661296                                        NSMutableDictionary *modesTable = [[NSMutableDictionary allocWithZone:nil] initWithCapacity:[modes length]]; 
    12671297                                        unsigned length = [modes length]; 
     
    12691299                                        for( i = 0; i < length; i++ ) { 
    12701300                                                MVChatRoomMemberMode mode = MVChatRoomMemberNoModes; 
     1301                                                NSString *modeFeature = nil; 
    12711302                                                switch( [modes characterAtIndex:i] ) { 
    1272                                                         case 'v': mode = MVChatRoomMemberVoicedMode; break; 
    1273                                                         case 'h': mode = MVChatRoomMemberHalfOperatorMode; break; 
    1274                                                         case 'o': mode = MVChatRoomMemberOperatorMode; break; 
    1275                                                         case 'a': mode = MVChatRoomMemberAdministratorMode; break; 
    1276                                                         case 'u': mode = MVChatRoomMemberAdministratorMode; break; 
    1277                                                         case 'q': mode = MVChatRoomMemberFounderMode; break; 
     1303                                                        case 'v': mode = MVChatRoomMemberVoicedMode; modeFeature = MVChatRoomMemberVoicedFeature; break; 
     1304                                                        case 'h': mode = MVChatRoomMemberHalfOperatorMode; modeFeature = MVChatRoomMemberHalfOperatorFeature; break; 
     1305                                                        case 'o': mode = MVChatRoomMemberOperatorMode; modeFeature = MVChatRoomMemberOperatorFeature; break; 
     1306                                                        case 'a': 
     1307                                                        case 'u': mode = MVChatRoomMemberAdministratorMode; modeFeature = MVChatRoomMemberAdministratorFeature; break; 
     1308                                                        case 'q': mode = MVChatRoomMemberFounderMode; modeFeature = MVChatRoomMemberFounderFeature; break; 
    12781309                                                        default: break; 
    12791310                                                } 
     
    12831314                                                        [modesTable setObject:[NSNumber numberWithUnsignedLong:mode] forKey:key]; 
    12841315                                                        [key release]; 
     1316 
     1317                                                        if( modeFeature ) { 
     1318                                                                @synchronized( _supportedFeatures ) { 
     1319                                                                         [_supportedFeatures addObject:modeFeature]; 
     1320                                                                } 
     1321                                                        } 
    12851322                                                } 
    12861323                                        } 
  • trunk/Models/JVChatMessage.m

    r3072 r3228  
    571571                if( [(JVChatRoomMember *)[self sender] serverOperator] ) return @"server operator"; 
    572572                else if( [(JVChatRoomMember *)[self sender] roomFounder] ) return @"room founder"; 
     573                else if( [(JVChatRoomMember *)[self sender] roomAdministrator] ) return @"room administrator"; 
    573574                else if( [(JVChatRoomMember *)[self sender] operator] ) return @"operator"; 
    574575                else if( [(JVChatRoomMember *)[self sender] halfOperator] ) return @"half operator"; 
  • trunk/Panels/JVChatRoomMember.h

    r3072 r3228  
    4444- (BOOL) operator; 
    4545- (BOOL) halfOperator; 
     46- (BOOL) roomAdministrator; 
    4647- (BOOL) roomFounder; 
    4748- (BOOL) serverOperator; 
  • trunk/Panels/JVChatRoomMember.m

    r3072 r3228  
    7676- (NSComparisonResult) compareUsingStatus:(JVChatRoomMember *) member { 
    7777        NSComparisonResult retVal = NSOrderedSame; 
    78         unsigned myStatus = 0, yourStatus = 0; 
    79  
    80         myStatus = ( [self serverOperator] ? 50 : ( [self operator] ? 10 : ( [self halfOperator] ? 5 : ( [self voice] ? 1 : 0 ) ) ) ); 
    81         yourStatus = ( [member serverOperator] ? 50 : ( [member operator] ? 10 : ( [member halfOperator] ? 5 : ( [member voice] ? 1 : 0 ) ) ) ); 
     78        unsigned long myStatus = 0, yourStatus = 0; 
     79 
     80        myStatus = ( [self serverOperator] ? 1 << 8 : [[[self room] target] modesForMemberUser:[self user]] & ~MVChatRoomMemberQuietedMode ); 
     81        yourStatus = ( [member serverOperator] ? 1 << 8 : [[[member room] target] modesForMemberUser:[member user]] & ~MVChatRoomMemberQuietedMode ); 
    8282 
    8383        if( myStatus > yourStatus ) { 
     
    181181} 
    182182 
     183- (BOOL) roomAdministrator { 
     184        return ( [[[self room] target] modesForMemberUser:[self user]] & MVChatRoomMemberAdministratorMode ); 
     185} 
     186 
    183187- (BOOL) roomFounder { 
    184188        return ( [[[self room] target] modesForMemberUser:[self user]] & MVChatRoomMemberFounderMode ); 
     
    252256- (NSImage *) icon { 
    253257        NSImage *icon = nil; 
    254         if( [self serverOperator] ) icon = [NSImage imageNamed:@"admin"]; 
    255         else if( [self operator] ) icon = [NSImage imageNamed:@"op"]; 
    256         else if( [self halfOperator] ) icon = [NSImage imageNamed:@"half-op"]; 
    257         else if( [self voice] ) icon = [NSImage imageNamed:@"voice"]; 
     258        unsigned long modes = [[[self room] target] modesForMemberUser:[self user]]; 
     259 
     260        if( [[self user] isServerOperator] ) icon = [NSImage imageNamed:@"admin"]; 
     261        else if( modes & MVChatRoomMemberOperatorMode ) icon = [NSImage imageNamed:@"op"]; 
     262        else if( modes & MVChatRoomMemberHalfOperatorMode ) icon = [NSImage imageNamed:@"half-op"]; 
     263        else if( modes & MVChatRoomMemberVoicedMode ) icon = [NSImage imageNamed:@"voice"]; 
    258264        else icon = [NSImage imageNamed:@"person"]; 
    259  
    260 /*      if( [[self user] isIdentified] ) { 
    261                 NSImage *badge = [NSImage imageNamed:@"identified-badge"]; 
    262                 NSImage *new = [[[NSImage alloc] initWithSize:[icon size]] autorelease]; 
    263                 [new lockFocus]; 
    264         [icon compositeToPoint:NSMakePoint( 0., 0. ) operation:NSCompositeCopy]; 
    265         [badge compositeToPoint:NSMakePoint( 0., 0. ) operation:NSCompositeSourceOver]; 
    266                 [new unlockFocus]; 
    267                 icon = new; 
    268         } */ 
    269265 
    270266        return icon; 
     
    395391                [menu addItem:[NSMenuItem separatorItem]]; 
    396392 
    397                 item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Make Operator", "make operator contextual menu - admin only" ) action:@selector( toggleOperatorStatus: ) keyEquivalent:@""] autorelease]; 
    398                 [item setTarget:self]; 
    399                 [menu addItem:item]; 
    400  
    401                 item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Make Half Operator", "make half-operator contextual menu - admin only" ) action:@selector( toggleHalfOperatorStatus: ) keyEquivalent:@""] autorelease]; 
    402                 [item setTarget:self]; 
    403                 [menu addItem:item]; 
    404  
    405                 item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Grant Voice", "grant voice contextual menu - admin only" ) action:@selector( toggleVoiceStatus: ) keyEquivalent:@""] autorelease]; 
    406                 [item setTarget:self]; 
    407                 [menu addItem:item]; 
    408  
    409 /*              item = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString( @"Force Quiet", "force quiet contextual menu - admin only" ) action:@selector( toggleQuietedStatus: ) keyEquivalent:@""] autorelease]; 
    410                 [item setTarget:self]; 
    411                 [menu addItem:item]; */ 
     393                NSSet *features = [[self connection] supportedFeatures]; 
     394 
     395                if( [features containsObject:MVChatRoomMemberOperatorFeature] ) { 
     396                        // correct title is added later in validateMenuItem: 
     397                        item = [[[NSMenuItem alloc] initWithTitle:@"" action:@selector( toggleOperatorStatus: ) keyEquivalent:@""] autorelease]; 
     398                        [item setTarget:self]; 
     399                        [menu addItem:item]; 
     400                } 
     401 
     402                if( [features containsObject:MVChatRoomMemberHalfOperatorFeature] ) { 
     403                        // correct title is added later in validateMenuItem: 
     404                        item = [[[NSMenuItem alloc] initWithTitle:@"" action:@selector( toggleHalfOperatorStatus: ) keyEquivalent:@""] autorelease]; 
     405                        [item setTarget:self]; 
     406                        [menu addItem:item]; 
     407                } 
     408 
     409                if( [features containsObject:MVChatRoomMemberVoicedFeature] ) { 
     410                        // correct title is added later in validateMenuItem: 
     411                        item = [[[NSMenuItem alloc] initWithTitle:@"" action:@selector( toggleVoiceStatus: ) keyEquivalent:@""] autorelease]; 
     412                        [item setTarget:self]; 
     413                        [menu addItem:item]; 
     414                } 
     415 
     416                if( [features containsObject:MVChatRoomMemberQuietedFeature] ) { 
     417                        // correct title is added later in validateMenuItem: 
     418                        item = [[[NSMenuItem alloc] initWithTitle:@"" action:@selector( toggleQuietedStatus: ) keyEquivalent:@""] autorelease]; 
     419                        [item setTarget:self]; 
     420                        [menu addItem:item]; 
     421                } 
    412422        } 
    413423