| 1242 | | |
|---|
| 1243 | | return; |
|---|
| | 1251 | } else if( [feature isKindOfClass:[NSString class]] && [feature hasPrefix:@"CHANTYPES="] ) { |
|---|
| | 1252 | NSString *types = [feature substringFromIndex:10]; // length of "CHANTYPES=" |
|---|
| | 1253 | if( [types length] ) { |
|---|
| | 1254 | id old = _roomPrefixes; |
|---|
| | 1255 | _roomPrefixes = [[NSCharacterSet characterSetWithCharactersInString:types] retain]; |
|---|
| | 1256 | [old release]; |
|---|
| | 1257 | } |
|---|
| | 1258 | } else if( [feature isKindOfClass:[NSString class]] && [feature hasPrefix:@"PREFIX="] ) { |
|---|
| | 1259 | NSScanner *scanner = [NSScanner scannerWithString:feature]; |
|---|
| | 1260 | [scanner setScanLocation:7]; // length of "PREFIX=" |
|---|
| | 1261 | if( [scanner scanString:@"(" intoString:NULL] ) { |
|---|
| | 1262 | NSString *modes = nil; |
|---|
| | 1263 | if( [scanner scanUpToString:@")" intoString:&modes] ) { |
|---|
| | 1264 | [scanner scanString:@")" intoString:NULL]; |
|---|
| | 1265 | |
|---|
| | 1266 | NSMutableDictionary *modesTable = [[NSMutableDictionary allocWithZone:nil] initWithCapacity:[modes length]]; |
|---|
| | 1267 | unsigned length = [modes length]; |
|---|
| | 1268 | unsigned i = 0; |
|---|
| | 1269 | for( i = 0; i < length; i++ ) { |
|---|
| | 1270 | MVChatRoomMemberMode mode = MVChatRoomMemberNoModes; |
|---|
| | 1271 | 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; |
|---|
| | 1278 | default: break; |
|---|
| | 1279 | } |
|---|
| | 1280 | |
|---|
| | 1281 | if( mode != MVChatRoomMemberNoModes ) { |
|---|
| | 1282 | NSString *key = [[NSString allocWithZone:nil] initWithFormat:@"%c", [modes characterAtIndex:i]]; |
|---|
| | 1283 | [modesTable setObject:[NSNumber numberWithUnsignedLong:mode] forKey:key]; |
|---|
| | 1284 | [key release]; |
|---|
| | 1285 | } |
|---|
| | 1286 | } |
|---|
| | 1287 | |
|---|
| | 1288 | if( [modesTable count] ) [_serverInformation setObject:modesTable forKey:@"roomMemberModeTable"]; |
|---|
| | 1289 | [_serverInformation setObject:[NSCharacterSet characterSetWithCharactersInString:modes] forKey:@"roomMemberModes"]; |
|---|
| | 1290 | |
|---|
| | 1291 | NSString *prefixes = [feature substringFromIndex:[scanner scanLocation]]; |
|---|
| | 1292 | if( [prefixes length] ) { |
|---|
| | 1293 | NSMutableDictionary *prefixTable = [[NSMutableDictionary allocWithZone:nil] initWithCapacity:[modes length]]; |
|---|
| | 1294 | unsigned length = [prefixes length]; |
|---|
| | 1295 | unsigned i = 0; |
|---|
| | 1296 | for( i = 0; i < length; i++ ) { |
|---|
| | 1297 | MVChatRoomMemberMode mode = MVChatRoomMemberNoModes; |
|---|
| | 1298 | switch( [prefixes characterAtIndex:i] ) { |
|---|
| | 1299 | case '+': mode = MVChatRoomMemberVoicedMode; break; |
|---|
| | 1300 | case '%': mode = MVChatRoomMemberHalfOperatorMode; break; |
|---|
| | 1301 | case '@': mode = MVChatRoomMemberOperatorMode; break; |
|---|
| | 1302 | case '&': mode = MVChatRoomMemberAdministratorMode; break; |
|---|
| | 1303 | case '!': mode = MVChatRoomMemberAdministratorMode; break; |
|---|
| | 1304 | case '*': mode = MVChatRoomMemberAdministratorMode; break; |
|---|
| | 1305 | case '~': mode = MVChatRoomMemberFounderMode; break; |
|---|
| | 1306 | case '.': mode = MVChatRoomMemberFounderMode; break; |
|---|
| | 1307 | default: break; |
|---|
| | 1308 | } |
|---|
| | 1309 | |
|---|
| | 1310 | if( mode != MVChatRoomMemberNoModes ) { |
|---|
| | 1311 | NSString *key = [[NSString allocWithZone:nil] initWithFormat:@"%c", [prefixes characterAtIndex:i]]; |
|---|
| | 1312 | [prefixTable setObject:[NSNumber numberWithUnsignedLong:mode] forKey:key]; |
|---|
| | 1313 | [key release]; |
|---|
| | 1314 | } |
|---|
| | 1315 | } |
|---|
| | 1316 | |
|---|
| | 1317 | if( [prefixTable count] ) [_serverInformation setObject:prefixTable forKey:@"roomMemberPrefixTable"]; |
|---|
| | 1318 | [_serverInformation setObject:[NSCharacterSet characterSetWithCharactersInString:prefixes] forKey:@"roomMemberPrefixes"]; |
|---|
| | 1319 | } |
|---|
| | 1320 | } |
|---|
| | 1321 | } |
|---|
| 1925 | | unsigned int i = 0, len = [memberName length]; |
|---|
| 1926 | | if( ! len ) break; |
|---|
| 1927 | | |
|---|
| 1928 | | unsigned long modes = MVChatRoomMemberNoModes; |
|---|
| 1929 | | BOOL done = NO; |
|---|
| 1930 | | |
|---|
| 1931 | | while( i < len && ! done ) { |
|---|
| 1932 | | unichar c = [memberName characterAtIndex:i]; |
|---|
| 1933 | | switch( c ) { |
|---|
| 1934 | | case '+': modes |= MVChatRoomMemberVoicedMode; break; |
|---|
| 1935 | | case '%': modes |= MVChatRoomMemberHalfOperatorMode; break; |
|---|
| 1936 | | case '@': modes |= MVChatRoomMemberOperatorMode; break; |
|---|
| 1937 | | default: done = YES; break; |
|---|
| | 2005 | if( ! [memberName length] ) break; |
|---|
| | 2006 | |
|---|
| | 2007 | MVChatRoomMemberMode modes = MVChatRoomMemberNoModes; |
|---|
| | 2008 | if( _serverInformation ) { |
|---|
| | 2009 | NSMutableDictionary *prefixes = [_serverInformation objectForKey:@"roomMemberPrefixTable"]; |
|---|
| | 2010 | NSString *key = [[NSString allocWithZone:nil] initWithFormat:@"%c", [memberName characterAtIndex:0]]; |
|---|
| | 2011 | modes = [[prefixes objectForKey:key] unsignedLongValue]; |
|---|
| | 2012 | [key release]; |
|---|
| | 2013 | } else { |
|---|
| | 2014 | switch( [memberName characterAtIndex:0] ) { |
|---|
| | 2015 | case '+': modes = MVChatRoomMemberVoicedMode; break; |
|---|
| | 2016 | case '@': modes = MVChatRoomMemberOperatorMode; break; |
|---|
| | 2017 | default: break; |
|---|