William Bowling is sharing code with you
Bitbucket is a code hosting site. Unlimited public and private repositories. Free for small teams.
Don't show this again1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | /*
* 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/AIChat.h>
#import <Adium/AIContactAlertsControllerProtocol.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;
/*!
* @brief Install
*/
- (void)installPlugin
{
[adium.contentController registerContentFilter:self
ofType:AIFilterContent
direction:AIFilterIncoming];
[adium.preferenceController registerPreferenceObserver:self
forGroup:PREF_GROUP_GENERAL];
advancedPreferences = [[AIMentionAdvancedPreferences preferencePaneForPlugin:self] retain];
}
- (void)uninstallPlugin
{
[adium.contentController unregisterContentFilter:self];
[adium.preferenceController unregisterPreferenceObserver:self];
}
#pragma mark -
/*!
* @brief Filter
*/
- (NSAttributedString *)filterAttributedString:(NSAttributedString *)inAttributedString context:(id)context;
{
if(![context isKindOfClass:[AIContentMessage class]])
return inAttributedString;
AIContentMessage *message = (AIContentMessage *)context;
AIChat *chat = message.chat;
if(!chat.isGroupChat)
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,
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"];
break;
}
}
return inAttributedString;
}
/*!
* @brief Filter priority
*/
- (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)]]]];
} else {
[predicates addObject:[NSPredicate predicateWithFormat:@"SELF MATCHES[cd] %@", [NSString stringWithFormat:@".*\\b%@\\b.*", [mention stringByEscapingForRegexp]]]];
}
}
self.mentionPredicates = predicates;
}
}
@end
|