Changeset 3228
- Timestamp:
- 05/06/06 14:42:51 (2 years ago)
- Files:
-
- trunk/Chat Core.exp (modified) (1 diff)
- trunk/Chat Core/MVChatRoom.h (modified) (1 diff)
- trunk/Chat Core/MVChatRoom.m (modified) (1 diff)
- trunk/Chat Core/MVIRCChatConnection.h (modified) (2 diffs)
- trunk/Chat Core/MVIRCChatConnection.m (modified) (9 diffs)
- trunk/Models/JVChatMessage.m (modified) (1 diff)
- trunk/Panels/JVChatRoomMember.h (modified) (1 diff)
- trunk/Panels/JVChatRoomMember.m (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/Chat Core.exp
r3190 r3228 31 31 _MVChatRoomKickedNotification 32 32 _MVChatRoomInvitedNotification 33 _MVChatRoomMemberQuietedFeature 34 _MVChatRoomMemberVoicedFeature 35 _MVChatRoomMemberHalfOperatorFeature 36 _MVChatRoomMemberOperatorFeature 37 _MVChatRoomMemberAdministratorFeature 38 _MVChatRoomMemberFounderFeature 33 39 _MVChatRoomMemberUsersSyncedNotification 34 40 _MVChatRoomBannedUsersSyncedNotification trunk/Chat Core/MVChatRoom.h
r3224 r3228 21 21 MVChatRoomMemberFounderMode = 1 << 5 22 22 } MVChatRoomMemberMode; 23 24 extern NSString *MVChatRoomMemberQuietedFeature; 25 extern NSString *MVChatRoomMemberVoicedFeature; 26 extern NSString *MVChatRoomMemberHalfOperatorFeature; 27 extern NSString *MVChatRoomMemberOperatorFeature; 28 extern NSString *MVChatRoomMemberAdministratorFeature; 29 extern NSString *MVChatRoomMemberFounderFeature; 23 30 24 31 extern NSString *MVChatRoomJoinedNotification; trunk/Chat Core/MVChatRoom.m
r3150 r3228 7 7 #import "NSDataAdditions.h" 8 8 #import "NSNotificationAdditions.h" 9 10 NSString *MVChatRoomMemberQuietedFeature = @"MVChatRoomMemberQuietedFeature"; 11 NSString *MVChatRoomMemberVoicedFeature = @"MVChatRoomMemberVoicedFeature"; 12 NSString *MVChatRoomMemberHalfOperatorFeature = @"MVChatRoomMemberHalfOperatorFeature"; 13 NSString *MVChatRoomMemberOperatorFeature = @"MVChatRoomMemberOperatorFeature"; 14 NSString *MVChatRoomMemberAdministratorFeature = @"MVChatRoomMemberAdministratorFeature"; 15 NSString *MVChatRoomMemberFounderFeature = @"MVChatRoomMemberFounderFeature"; 9 16 10 17 NSString *MVChatRoomJoinedNotification = @"MVChatRoomJoinedNotification"; trunk/Chat Core/MVIRCChatConnection.h
r3224 r3228 19 19 NSMutableSet *_pendingWhoisUsers; 20 20 NSMutableSet *_fileTransfers; 21 NSMutableSet *_supportedFeatures; 21 22 NSMutableDictionary *_serverInformation; 22 23 NSString *_server; … … 65 66 - (void) _whoisNextScheduledUser; 66 67 68 - (void) _resetSupportedFeatures; 69 67 70 - (NSString *) _stringFromPossibleData:(id) input; 68 71 @end trunk/Chat Core/MVIRCChatConnection.m
r3227 r3228 91 91 _realName = [NSFullUserName() retain]; 92 92 _threadWaitLock = [[NSConditionLock allocWithZone:nil] initWithCondition:0]; 93 _supportedFeatures = [[NSMutableSet allocWithZone:nil] initWithCapacity:10]; 94 [self _resetSupportedFeatures]; 93 95 } 94 96 … … 126 128 [_roomPrefixes release]; 127 129 [_serverInformation release]; 130 [_supportedFeatures release]; 128 131 129 132 _chatConnection = nil; … … 146 149 _roomPrefixes = nil; 147 150 _serverInformation = nil; 151 _supportedFeatures = nil; 148 152 149 153 [super dealloc]; … … 161 165 162 166 - (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; 164 177 } 165 178 … … 182 195 183 196 [self _resetSendQueueInterval]; 197 [self _resetSupportedFeatures]; 184 198 185 199 [self _willConnect]; // call early so other code has a chance to change our info … … 1033 1047 } 1034 1048 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 1035 1059 #pragma mark - 1036 1060 … … 1264 1288 [scanner scanString:@")" intoString:NULL]; 1265 1289 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 1266 1296 NSMutableDictionary *modesTable = [[NSMutableDictionary allocWithZone:nil] initWithCapacity:[modes length]]; 1267 1297 unsigned length = [modes length]; … … 1269 1299 for( i = 0; i < length; i++ ) { 1270 1300 MVChatRoomMemberMode mode = MVChatRoomMemberNoModes; 1301 NSString *modeFeature = nil; 1271 1302 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; 1278 1309 default: break; 1279 1310 } … … 1283 1314 [modesTable setObject:[NSNumber numberWithUnsignedLong:mode] forKey:key]; 1284 1315 [key release]; 1316 1317 if( modeFeature ) { 1318 @synchronized( _supportedFeatures ) { 1319 [_supportedFeatures addObject:modeFeature]; 1320 } 1321 } 1285 1322 } 1286 1323 } trunk/Models/JVChatMessage.m
r3072 r3228 571 571 if( [(JVChatRoomMember *)[self sender] serverOperator] ) return @"server operator"; 572 572 else if( [(JVChatRoomMember *)[self sender] roomFounder] ) return @"room founder"; 573 else if( [(JVChatRoomMember *)[self sender] roomAdministrator] ) return @"room administrator"; 573 574 else if( [(JVChatRoomMember *)[self sender] operator] ) return @"operator"; 574 575 else if( [(JVChatRoomMember *)[self sender] halfOperator] ) return @"half operator"; trunk/Panels/JVChatRoomMember.h
r3072 r3228 44 44 - (BOOL) operator; 45 45 - (BOOL) halfOperator; 46 - (BOOL) roomAdministrator; 46 47 - (BOOL) roomFounder; 47 48 - (BOOL) serverOperator; trunk/Panels/JVChatRoomMember.m
r3072 r3228 76 76 - (NSComparisonResult) compareUsingStatus:(JVChatRoomMember *) member { 77 77 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 ); 82 82 83 83 if( myStatus > yourStatus ) { … … 181 181 } 182 182 183 - (BOOL) roomAdministrator { 184 return ( [[[self room] target] modesForMemberUser:[self user]] & MVChatRoomMemberAdministratorMode ); 185 } 186 183 187 - (BOOL) roomFounder { 184 188 return ( [[[self room] target] modesForMemberUser:[self user]] & MVChatRoomMemberFounderMode ); … … 252 256 - (NSImage *) icon { 253 257 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"]; 258 264 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 } */269 265 270 266 return icon; … … 395 391 [menu addItem:[NSMenuItem separatorItem]]; 396 392 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 } 412 422 } 413 423
