// // ALBuddyStatus.m // ABBuddyStatus hax // // Created by Joe on 2007-05-18. // Copyright 2007 Alacatia Labs. All rights reserved. // #import "ALBuddyStatus.h" static NSDistantObject * adium = nil; @implementation ALBuddyStatus - (id)init { if(self = [super init]) { [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(adiumLaunched:) name:AIApplicationDidFinishLoadingNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(disconnectedFromAdium:) name:NSConnectionDidDieNotification object:nil]; [self connectToAdium]; } return self; } - (void)dealloc { // known issue: if we crash, dealloc isn't called, and our remote proxy object isn't removed from adium's notification center... [[adium notificationCenter] removeObserver:self]; [[NSNotificationCenter defaultCenter] removeObserver:self]; [[NSDistributedNotificationCenter defaultCenter] removeObserver:self]; [adium release]; [super dealloc]; } - (void)connectToAdium { if(!adium) { adium = [[NSConnection rootProxyForConnectionWithRegisteredName:@"com.adiumX.adiumX" host:nil] retain]; [adium setProtocolForProxy:@protocol(AIAdium)]; [[adium notificationCenter] addObserver:self selector:@selector(contactStatusChanged:) name:ListObject_StatusChanged object:nil]; } } - (void)adiumLaunched:(NSNotification *)notification { [self connectToAdium]; } - (void)disconnectedFromAdium:(NSNotification *)notification { adium = nil; } - (void)contactStatusChanged:(NSNotification *)notification { NSLog(@"%@", notification); [[NSNotificationCenter defaultCenter] postNotificationName:@"ABBuddyStatusChangedNotification" object:self]; } - (BOOL)isAvaliable:(ABPerson *)person { if([super isAvaliable:person]) { return YES; } ABMultiValue * AIMScreennamesMultiValue = [person valueForProperty:kABAIMInstantProperty]; ABMultiValue * jabberScreennamesMultiValue = [person valueForProperty:kABJabberInstantProperty]; int i = 0; for (i = 0; i < [AIMScreennamesMultiValue count]; i++) { if([self isHandleAvailable:[AIMScreennamesMultiValue valueAtIndex:i] onService:@"AIM"]) { return YES; } } for (i = 0; i < [jabberScreennamesMultiValue count]; i++) { if([self isHandleAvailable:[jabberScreennamesMultiValue valueAtIndex:i] onService:@"Jabber"]) { return YES; } } return NO; } - (BOOL)isHandleAvailable:(NSString *)handle onService:(NSString *)serviceID { AIService * service = [[adium accountController] firstServiceWithServiceID:serviceID]; NSSet * contacts = [[adium contactController] allContactsWithService:service UID:handle existingOnly:YES]; NSEnumerator * enumerator = [contacts objectEnumerator]; AIListContact * contact = nil; while(contact = [enumerator nextObject]) { if([contact statusType] == AIAvailableStatusType) { return YES; } } return NO; } - (BOOL)isHandleAvailable:(NSString *)handle { [self connectToAdium]; return ( [super isHandleAvailable:handle] || [self isHandleAvailable:handle onService:@"AIM"] || [self isHandleAvailable:handle onService:@"Jabber"] ); } @end