2014-01-06 17:55:14 -08:00
//
// OSKFacebookUtility . m
// Overshare
//
// Created by Jared Sinclair 10 / 29 / 13.
// Copyright ( c ) 2013 Overshare Kit . All rights reserved .
//
@ import Social ;
# import "OSKFacebookUtility.h"
# import "OSKShareableContentItem.h"
# import "OSKSystemAccountStore.h"
# import "OSKLogger.h"
@ implementation OSKFacebookUtility
+ ( void ) renewCredentials : ( ACAccount * ) account completion : ( void ( ^ ) ( BOOL success , NSError * error ) ) completion {
[ [ OSKSystemAccountStore sharedInstance ] renewCredentialsForAccount : account completion : ^ ( ACAccountCredentialRenewResult renewResult , NSError * theError ) {
if ( completion ) {
completion ( ( renewResult = = ACAccountCredentialRenewResultRenewed ) , theError ) ;
}
} ] ;
}
2014-05-19 13:33:42 -07:00
+ ( void ) postContentItem : ( OSKFacebookContentItem * ) item toSystemAccount : ( ACAccount * ) account options : ( NSDictionary * ) options completion : ( void ( ^ ) ( BOOL success , NSError * error ) ) completion {
2014-01-06 17:55:14 -08:00
dispatch_async ( dispatch_get _global _queue ( DISPATCH_QUEUE _PRIORITY _DEFAULT , 0 ) , ^ {
[ self renewCredentials : ( ACAccount * ) account completion : ^ ( BOOL theSuccess , NSError * theError ) {
if ( theSuccess ) {
dispatch_async ( dispatch_get _global _queue ( DISPATCH_QUEUE _PRIORITY _DEFAULT , 0 ) , ^ {
[ self _postContentItem : item toSystemAccount : account options : options completion : completion ] ;
} ) ;
} else {
if ( completion ) {
dispatch_async ( dispatch_get _main _queue ( ) , ^ {
completion ( NO , theError ) ;
} ) ;
}
}
} ] ;
} ) ;
}
2014-05-19 13:33:42 -07:00
+ ( void ) _postContentItem : ( OSKFacebookContentItem * ) item toSystemAccount : ( ACAccount * ) account options : ( NSDictionary * ) options completion : ( void ( ^ ) ( BOOL success , NSError * error ) ) completion {
2014-01-06 17:55:14 -08:00
SLRequestHandler requestHandler = ^ ( NSData * responseData , NSHTTPURLResponse * urlResponse , NSError * error ) {
if ( responseData ! = nil ) {
__unused NSString * response = [ [ NSString alloc ] initWithData : responseData encoding : NSUTF8StringEncoding ] ;
OSKLog ( @ "%@" , response ) ;
NSInteger statusCode = urlResponse . statusCode ;
if ( ( statusCode >= 200 ) && ( statusCode < 300 ) ) {
dispatch_async ( dispatch_get _main _queue ( ) , ^ {
completion ( YES , nil ) ;
} ) ;
}
else {
NSString * errorMessage = [ NSString stringWithFormat : @ "[OSKFacebookUtility] Error received when trying to create a new tweet. Server responded with status code %li and response: %@" , ( long ) statusCode , [ NSHTTPURLResponse localizedStringForStatusCode : statusCode ] ] ;
OSKLog ( @ "%@" , errorMessage ) ;
NSError * error = [ NSError errorWithDomain : @ "com.overshare.errors"
code : statusCode
userInfo : @ { NSLocalizedFailureReasonErrorKey : errorMessage } ] ;
dispatch_async ( dispatch_get _main _queue ( ) , ^ {
completion ( NO , error ) ;
} ) ;
}
}
else {
NSString * errorMessage = [ NSString stringWithFormat : @ "[OSKFacebookUtility] An error occurred while attempting to post a new tweet: %@" , [ error localizedDescription ] ] ;
OSKLog ( @ "%@" , errorMessage ) ;
NSError * error = [ NSError errorWithDomain : @ "com.overshare.errors"
code : 400
userInfo : @ { NSLocalizedFailureReasonErrorKey : errorMessage } ] ;
dispatch_async ( dispatch_get _main _queue ( ) , ^ {
completion ( NO , error ) ;
} ) ;
}
} ;
if ( item . images . count = = 0 ) {
SLRequest * feedRequest = [ self plainTextMessageRequestForContentItem : item options : options account : account ] ;
[ feedRequest performRequestWithHandler : requestHandler ] ;
} else {
__block NSInteger remainingCount = item . images . count ;
__block BOOL failed = NO ;
NSIndexSet * successRange = [ NSIndexSet indexSetWithIndexesInRange : NSMakeRange ( 200 , 100 ) ] ;
for ( UIImage * image in item . images ) {
SLRequest * feedRequest = [ self photoUploadRequestForContentItem : item options : options image : image account : account ] ;
[ feedRequest performRequestWithHandler : ^ ( NSData * responseData , NSHTTPURLResponse * urlResponse , NSError * error ) {
if ( completion ) {
dispatch_async ( dispatch_get _main _queue ( ) , ^ {
remainingCount - - ;
if ( error ! = nil || [ successRange containsIndex : [ urlResponse statusCode ] ] = = NO ) {
failed = YES ;
completion ( NO , error ) ;
}
if ( remainingCount = = 0 && failed = = NO ) {
completion ( YES , nil ) ;
}
} ) ;
}
} ] ;
}
}
}
2014-05-19 13:33:42 -07:00
+ ( SLRequest * ) plainTextMessageRequestForContentItem : ( OSKFacebookContentItem * ) item options : ( NSDictionary * ) options account : ( ACAccount * ) account {
2014-09-17 16:58:44 -07:00
2014-01-06 17:55:14 -08:00
SLRequest * feedRequest = nil ;
2014-09-17 16:58:44 -07:00
NSMutableDictionary * parameters = [ [ NSMutableDictionary alloc ] init ] ;
if ( item . text . length ) {
[ parameters setObject : item . text . copy forKey : @ "message" ] ;
}
2014-05-19 13:33:42 -07:00
if ( item . link . absoluteString ) {
[ parameters setObject : item . link . absoluteString forKey : @ "link" ] ;
}
2014-09-17 16:58:44 -07:00
2014-01-06 17:55:14 -08:00
[ parameters setObject : [ self _queryParameterForAudience : options [ ACFacebookAudienceKey ] ] forKey : @ "privacy" ] ;
2014-09-17 16:58:44 -07:00
2014-01-06 17:55:14 -08:00
NSURL * feedURL = [ NSURL URLWithString : @ "https://graph.facebook.com/me/feed" ] ;
feedRequest = [ SLRequest
requestForServiceType : SLServiceTypeFacebook
requestMethod : SLRequestMethodPOST
URL : feedURL
parameters : parameters ] ;
feedRequest . account = account ;
return feedRequest ;
}
2014-05-19 13:33:42 -07:00
+ ( SLRequest * ) photoUploadRequestForContentItem : ( OSKFacebookContentItem * ) item options : ( NSDictionary * ) options image : ( UIImage * ) image account : ( ACAccount * ) account {
2014-01-06 17:55:14 -08:00
SLRequest * feedRequest = nil ;
2014-09-17 16:58:44 -07:00
NSMutableDictionary * parameters = [ [ NSMutableDictionary alloc ] init ] ;
if ( item . text . length ) {
[ parameters setObject : item . text . copy forKey : @ "message" ] ;
}
2014-01-06 17:55:14 -08:00
[ parameters setObject : [ self _queryParameterForAudience : options [ ACFacebookAudienceKey ] ] forKey : @ "privacy" ] ;
2014-09-17 16:58:44 -07:00
2014-01-06 17:55:14 -08:00
NSURL * feedURL = [ NSURL URLWithString : @ "https://graph.facebook.com/me/photos" ] ;
feedRequest = [ SLRequest
requestForServiceType : SLServiceTypeFacebook
requestMethod : SLRequestMethodPOST
URL : feedURL
parameters : parameters ] ;
feedRequest . account = account ;
NSData * imageData = UIImageJPEGRepresentation ( image , 0.25 f ) ;
NSString * dateSuffix = [ self _todaysDateSuffix ] ;
NSString * appName = [ [ NSBundle mainBundle ] objectForInfoDictionaryKey : @ "CFBundleDisplayName" ] ;
NSString * filename = [ NSString stringWithFormat : @ "Image_from_%@_%@.jpg" , appName , dateSuffix ] ;
[ feedRequest addMultipartData : imageData withName : @ "source" type : @ "image/jpeg" filename : filename ] ;
return feedRequest ;
}
+ ( NSString * ) _todaysDateSuffix {
2014-09-17 16:58:44 -07:00
NSDate * today = [ NSDate date ] ;
NSDateFormatter * formatter = [ [ NSDateFormatter alloc ] init ] ;
formatter . dateFormat = @ "yyyy-MM-dd" ;
NSString * suffix = [ formatter stringFromDate : today ] ;
return suffix ;
2014-01-06 17:55:14 -08:00
}
+ ( NSString * ) _queryParameterForAudience : ( NSString * ) audience {
NSString * param = nil ;
if ( [ audience isEqualToString : ACFacebookAudienceEveryone ] ) {
param = @ "{\" value \ ":\" EVERYONE \ "}" ;
}
else if ( [ audience isEqualToString : ACFacebookAudienceFriends ] ) {
param = @ "{\" value \ ":\" ALL_FRIENDS \ "}" ;
}
else if ( [ audience isEqualToString : ACFacebookAudienceOnlyMe ] ) {
param = @ "{\" value \ ":\" SELF \ "}" ;
}
return param ;
}
@ end