* Adium is the legal property of its developers, whose names are listed in the copyright file included * with this source distribution. * This program is free software; you can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation; either version 2 of the License, * or (at your option) any later version. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * You should have received a copy of the GNU General Public License along with this program; if not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #import <Adium/AIContentControllerProtocol.h> #import "AIMentionEventPlugin.h" #import <Adium/AIContactControllerProtocol.h> #import <Adium/AIContentObject.h> #import <Adium/AIListObject.h> #import <Adium/AIListContact.h> #import <Adium/AIAccount.h> #import <Adium/AIContentMessage.h> #import <Adium/AIContactAlertsControllerProtocol.h> #import "AIContentTopic.h" * @class AIMentionEventPlugin * @brief Simple content filter to generate events when incoming messages mention the user, and tag them with a special display class @implementation AIMentionEventPlugin @synthesize mentionPredicates ; [ adium . contentController registerContentFilter : self direction : AIFilterIncoming ]; [ adium . preferenceController registerPreferenceObserver : self forGroup : PREF_GROUP_GENERAL ]; advancedPreferences = [( AIMentionAdvancedPreferences * )[ AIMentionAdvancedPreferences preferencePaneForPlugin : self ] retain ]; [ adium . contentController unregisterContentFilter : self ]; [ adium . preferenceController unregisterPreferenceObserver : self ]; - ( NSAttributedString * ) filterAttributedString: ( NSAttributedString * ) inAttributedString context: ( id ) context ; if ( ! [ context isKindOfClass : [ AIContentMessage class ]] || [ context isKindOfClass : [ AIContentTopic class ]]) return inAttributedString ; AIContentMessage * message = ( AIContentMessage * ) context ; AIChat * chat = message . chat ; if ( ! chat . isGroupChat || message . isOutgoing ) return inAttributedString ; NSString * messageString = [ inAttributedString string ]; AIAccount * account = ( AIAccount * ) message . destination ; NSString * contactAlias = [ chat aliasForContact : [ account contactWithUID : account . UID ]]; // XXX When we fix user lists to contain accounts, fix this too. NSArray * myPredicates = [ NSArray arrayWithObjects : [ NSPredicate predicateWithFormat : @"SELF MATCHES[cd] %@" , [ NSString stringWithFormat : @".* \\ b%@ \\ b.*" , [ account . UID stringByEscapingForRegexp ]]], [ NSPredicate predicateWithFormat : @"SELF MATCHES[cd] %@" , [ NSString stringWithFormat : @".* \\ b%@ \\ b.*" , [ account . displayName stringByEscapingForRegexp ]]], /* can be nil */ contactAlias ? [ NSPredicate predicateWithFormat : @"SELF MATCHES[cd] %@" , [ NSString stringWithFormat : @".* \\ b%@ \\ b.*" , [ contactAlias stringByEscapingForRegexp ]]] : nil , myPredicates = [ myPredicates arrayByAddingObjectsFromArray : self . mentionPredicates ]; for ( NSPredicate * predicate in myPredicates ) { if ([ predicate evaluateWithObject : messageString ]) { if ( message . trackContent && adium . interfaceController . activeChat != chat ) { [ chat incrementUnviewedMentionCount ]; [ message addDisplayClass : @"mention" ]; return inAttributedString ; - ( CGFloat ) filterPriority return LOWEST_FILTER_PRIORITY ; * @brief Rebuild predicates on preference saves. #pragma mark Preference Observing - ( void ) preferencesChangedForGroup : ( NSString * ) group key : ( NSString * ) key object : ( AIListObject * ) object preferenceDict : ( NSDictionary * ) prefDict firstTime : ( BOOL ) firstTime if ( firstTime || [ key isEqualToString : PREF_KEY_MENTIONS ]) { NSArray * allMentions = [ adium . preferenceController preferenceForKey : PREF_KEY_MENTIONS group : PREF_GROUP_GENERAL ]; NSMutableArray * predicates = [ NSMutableArray arrayWithCapacity : [ allMentions count ]]; NSPredicate * regexPredicate = [ NSPredicate predicateWithFormat : @"SELF MATCHES '/.*/'" ]; for ( NSString * mention in allMentions ) { if ([ regexPredicate evaluateWithObject : mention ]) { [ predicates addObject : [ NSPredicate predicateWithFormat : @"SELF MATCHES[cd] %@" , [ NSString stringWithFormat : @".*%@.*" , [ mention substringWithRange : NSMakeRange ( 1 , [ mention length ] -2 )]]]]; [ predicates addObject : [ NSPredicate predicateWithFormat : @"SELF MATCHES[cd] %@" , [ NSString stringWithFormat : @".* \\ b%@ \\ b.*" , [ mention stringByEscapingForRegexp ]]]]; self . mentionPredicates = predicates ;