* 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/AIGroupChat.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; if(!message.chat.isGroupChat || message.isOutgoing) return inAttributedString; AIGroupChat *chat = (AIGroupChat *)message.chat; NSString *messageString = [inAttributedString string]; AIAccount *account = (AIAccount *)message.destination; // XXX When we fix user lists to contain accounts, fix this too. NSMutableArray *myPredicates = [NSMutableArray 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]]], for (NSString *nick in [chat nicksForContact:account]) { [myPredicates addObject:[NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@", [NSString stringWithFormat:@".*\\b%@\\b.*", [nick stringByEscapingForRegexp]]]]; [myPredicates addObjectsFromArray: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;