Plugins/Purple Service/PurpleFacebookAccount.m
author Zachary West <zacw@adium.im>
Fri Nov 27 13:11:03 2009 -0500 (2009-11-27)
changeset 2832 c2a6b90a5b53
parent 2731 e559b41be2b6
child 2859 41cc56470598
permissions -rw-r--r--
Enable facebook_manage_friends, so that we can actually manage friends lists. Fixes #13404.
Evan@660
     1
//
Evan@660
     2
//  PurpleFacebookAccount.m
Evan@660
     3
//  Adium
Evan@660
     4
//
Evan@660
     5
//  Created by Evan Schoenberg on 1/15/09.
Evan@660
     6
//  Copyright 2009 Adium X. All rights reserved.
Evan@660
     7
//
Evan@660
     8
Evan@660
     9
#import "PurpleFacebookAccount.h"
Evan@660
    10
#import <Adium/AIHTMLDecoder.h>
Evan@793
    11
#import <Adium/AIListContact.h>
David@837
    12
#import <Adium/AIStatus.h>
Evan@660
    13
Evan@660
    14
@implementation PurpleFacebookAccount
Evan@660
    15
Evan@660
    16
- (const char*)protocolPlugin
Evan@660
    17
{
Evan@660
    18
    return "prpl-bigbrownchunx-facebookim";
Evan@660
    19
}
Evan@660
    20
Evan@660
    21
- (NSString *)webProfileStringForContact:(AIListContact *)contact
Evan@660
    22
{
Evan@660
    23
	return [NSString stringWithFormat:NSLocalizedString(@"View %@'s Facebook profile", nil), 
David@837
    24
			contact.displayName];
Evan@660
    25
}
Evan@660
    26
Evan@660
    27
- (void)configurePurpleAccount
Evan@660
    28
{
Evan@660
    29
	[super configurePurpleAccount];
Evan@660
    30
	
Evan@660
    31
	/* We could add a pref for this, but not without some enhancements to mail notifications. Currently, this being
Evan@660
    32
	 * enabled means ugly nasty "You have new mail!" popups continuously, since that's how 'notifications' are passed
Evan@660
    33
	 * to us.
Evan@660
    34
	 */
Evan@660
    35
	purple_account_set_bool(account, "facebook_get_notifications", FALSE);
zacw@2731
    36
	
zacw@2731
    37
	// We do our own history; don't let the server's history get displayed as new messages
zacw@2731
    38
	purple_account_set_bool(account, "facebook_show_history", FALSE);
zacw@2731
    39
	
zacw@2832
    40
	// Use friends list as groups.
zacw@2731
    41
	purple_account_set_bool(account, "facebook_use_groups", TRUE);
zacw@2832
    42
	
zacw@2832
    43
	// Allow for moving through libpurple
zacw@2832
    44
	purple_account_set_bool(account, "facebook_manage_friends", TRUE);
Evan@660
    45
}
Evan@660
    46
Evan@660
    47
- (NSString *)host
Evan@660
    48
{
Evan@660
    49
	return @"login.facebook.com";
Evan@660
    50
}
Evan@660
    51
Evan@660
    52
- (const char *)purpleStatusIDForStatus:(AIStatus *)statusState
Evan@660
    53
							  arguments:(NSMutableDictionary *)arguments
Evan@660
    54
{
David@837
    55
	if (statusState.statusType == AIOfflineStatusType) {
Evan@660
    56
		return "offline";
Evan@660
    57
	} else {
Evan@660
    58
		return "available";
Evan@660
    59
	}
Evan@660
    60
}
Evan@660
    61
Evan@660
    62
- (void)setSocialNetworkingStatusMessage:(NSAttributedString *)statusMessage
Evan@660
    63
{
Evan@660
    64
	NSMutableDictionary *arguments = [NSMutableDictionary dictionary];
Evan@660
    65
	NSString *encodedStatusMessage = (statusMessage ? 
Evan@660
    66
									  [self encodedAttributedString:statusMessage
Evan@660
    67
													 forStatusState:nil] :
Evan@660
    68
									  nil);
Evan@660
    69
	if (encodedStatusMessage) {
Evan@660
    70
		[arguments setObject:encodedStatusMessage
Evan@660
    71
					  forKey:@"message"];
Evan@660
    72
	}
Evan@660
    73
Evan@660
    74
	purple_account_set_bool(account, "facebook_set_status_through_pidgin", TRUE);
Evan@660
    75
	[self setStatusState:nil
Evan@660
    76
				statusID:"available" /* facebook only supports available */
Evan@660
    77
				isActive:[NSNumber numberWithBool:YES]
Evan@660
    78
			   arguments:arguments];
Evan@660
    79
	purple_account_set_bool(account, "facebook_set_status_through_pidgin", FALSE);
Evan@660
    80
}
Evan@660
    81
Evan@660
    82
- (NSString *)encodedAttributedString:(NSAttributedString *)inAttributedString forListObject:(AIListObject *)inListObject
Evan@660
    83
{
Evan@660
    84
	return [AIHTMLDecoder encodeHTML:inAttributedString
Evan@660
    85
							 headers:YES
Evan@660
    86
							fontTags:YES
Evan@660
    87
				  includingColorTags:YES
Evan@660
    88
					   closeFontTags:YES
Evan@660
    89
						   styleTags:YES
Evan@660
    90
		  closeStyleTagsOnFontChange:YES
Evan@699
    91
					  encodeNonASCII:NO
Evan@660
    92
						encodeSpaces:NO
Evan@660
    93
						  imagesPath:nil
Evan@660
    94
				   attachmentsAsText:YES
Evan@660
    95
		   onlyIncludeOutgoingImages:NO
Evan@660
    96
					  simpleTagsOnly:NO
Evan@660
    97
					  bodyBackground:NO
Evan@660
    98
				 allowJavascriptURLs:YES];
Evan@660
    99
}
Evan@660
   100
Evan@793
   101
/*!
Evan@793
   102
 * @brief Set an alias for a contact
Evan@793
   103
 *
Evan@793
   104
 * Normally, we consider the name a 'serverside alias' unless it matches the UID's characters
Evan@793
   105
 * However, the UID in facebook should never be presented to the user if possible; it's for internal use
Evan@793
   106
 * only.  We'll therefore consider any alias a formatted UID such that it will replace the UID when displayed
Evan@793
   107
 * in Adium.
Evan@793
   108
 */
Evan@793
   109
- (void)updateContact:(AIListContact *)theContact toAlias:(NSString *)purpleAlias
Evan@793
   110
{
David@837
   111
	if (![purpleAlias isEqualToString:theContact.formattedUID] && 
David@837
   112
		![purpleAlias isEqualToString:theContact.UID]) {
Evan@793
   113
		[theContact setFormattedUID:purpleAlias
Evan@793
   114
							 notify:NotifyLater];
Evan@793
   115
		
Evan@793
   116
		//Apply any changes
Evan@793
   117
		[theContact notifyOfChangedPropertiesSilently:silentAndDelayed];
Evan@793
   118
	}
Evan@793
   119
}
Evan@793
   120
Evan@660
   121
@end