fbooker 1.0.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.autotest +15 -0
- data/CHANGELOG.rdoc +24 -0
- data/COPYING.rdoc +19 -0
- data/Manifest.txt +144 -0
- data/README.rdoc +113 -0
- data/Rakefile +94 -0
- data/TODO.rdoc +4 -0
- data/examples/desktop_login.rb +14 -0
- data/facebooker.gemspec +42 -0
- data/generators/facebook/facebook_generator.rb +14 -0
- data/generators/facebook/templates/config/facebooker.yml +49 -0
- data/generators/facebook/templates/public/javascripts/facebooker.js +332 -0
- data/generators/facebook_controller/USAGE +33 -0
- data/generators/facebook_controller/facebook_controller_generator.rb +40 -0
- data/generators/facebook_controller/templates/controller.rb +7 -0
- data/generators/facebook_controller/templates/functional_test.rb +11 -0
- data/generators/facebook_controller/templates/helper.rb +2 -0
- data/generators/facebook_controller/templates/view.fbml.erb +2 -0
- data/generators/facebook_controller/templates/view.html.erb +2 -0
- data/generators/facebook_publisher/facebook_publisher_generator.rb +14 -0
- data/generators/facebook_publisher/templates/create_facebook_templates.rb +15 -0
- data/generators/facebook_publisher/templates/publisher.rb +3 -0
- data/generators/facebook_scaffold/USAGE +27 -0
- data/generators/facebook_scaffold/facebook_scaffold_generator.rb +118 -0
- data/generators/facebook_scaffold/templates/controller.rb +93 -0
- data/generators/facebook_scaffold/templates/facebook_style.css +2579 -0
- data/generators/facebook_scaffold/templates/functional_test.rb +89 -0
- data/generators/facebook_scaffold/templates/helper.rb +2 -0
- data/generators/facebook_scaffold/templates/layout.fbml.erb +6 -0
- data/generators/facebook_scaffold/templates/layout.html.erb +17 -0
- data/generators/facebook_scaffold/templates/style.css +74 -0
- data/generators/facebook_scaffold/templates/view_edit.fbml.erb +13 -0
- data/generators/facebook_scaffold/templates/view_edit.html.erb +18 -0
- data/generators/facebook_scaffold/templates/view_index.fbml.erb +24 -0
- data/generators/facebook_scaffold/templates/view_index.html.erb +24 -0
- data/generators/facebook_scaffold/templates/view_new.fbml.erb +12 -0
- data/generators/facebook_scaffold/templates/view_new.html.erb +17 -0
- data/generators/facebook_scaffold/templates/view_show.fbml.erb +10 -0
- data/generators/facebook_scaffold/templates/view_show.html.erb +10 -0
- data/generators/publisher/publisher_generator.rb +14 -0
- data/generators/xd_receiver/templates/xd_receiver.html +10 -0
- data/generators/xd_receiver/templates/xd_receiver_ssl.html +10 -0
- data/generators/xd_receiver/xd_receiver_generator.rb +10 -0
- data/init.rb +26 -0
- data/install.rb +12 -0
- data/lib/facebooker.rb +252 -0
- data/lib/facebooker/adapters/adapter_base.rb +91 -0
- data/lib/facebooker/adapters/bebo_adapter.rb +77 -0
- data/lib/facebooker/adapters/facebook_adapter.rb +60 -0
- data/lib/facebooker/admin.rb +42 -0
- data/lib/facebooker/application.rb +13 -0
- data/lib/facebooker/batch_request.rb +45 -0
- data/lib/facebooker/data.rb +57 -0
- data/lib/facebooker/feed.rb +78 -0
- data/lib/facebooker/logging.rb +44 -0
- data/lib/facebooker/mobile.rb +20 -0
- data/lib/facebooker/mock/service.rb +50 -0
- data/lib/facebooker/mock/session.rb +18 -0
- data/lib/facebooker/model.rb +139 -0
- data/lib/facebooker/models/affiliation.rb +10 -0
- data/lib/facebooker/models/album.rb +11 -0
- data/lib/facebooker/models/applicationproperties.rb +39 -0
- data/lib/facebooker/models/applicationrestrictions.rb +10 -0
- data/lib/facebooker/models/cookie.rb +10 -0
- data/lib/facebooker/models/education_info.rb +11 -0
- data/lib/facebooker/models/event.rb +28 -0
- data/lib/facebooker/models/family_relative_info.rb +7 -0
- data/lib/facebooker/models/friend_list.rb +16 -0
- data/lib/facebooker/models/group.rb +36 -0
- data/lib/facebooker/models/info_item.rb +10 -0
- data/lib/facebooker/models/info_section.rb +10 -0
- data/lib/facebooker/models/location.rb +8 -0
- data/lib/facebooker/models/notifications.rb +17 -0
- data/lib/facebooker/models/page.rb +44 -0
- data/lib/facebooker/models/photo.rb +19 -0
- data/lib/facebooker/models/tag.rb +12 -0
- data/lib/facebooker/models/user.rb +552 -0
- data/lib/facebooker/models/video.rb +9 -0
- data/lib/facebooker/models/work_info.rb +10 -0
- data/lib/facebooker/parser.rb +717 -0
- data/lib/facebooker/rails/backwards_compatible_param_checks.rb +31 -0
- data/lib/facebooker/rails/controller.rb +353 -0
- data/lib/facebooker/rails/cucumber.rb +28 -0
- data/lib/facebooker/rails/cucumber/world.rb +40 -0
- data/lib/facebooker/rails/extensions/action_controller.rb +48 -0
- data/lib/facebooker/rails/extensions/rack_setup.rb +6 -0
- data/lib/facebooker/rails/extensions/routing.rb +15 -0
- data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
- data/lib/facebooker/rails/facebook_pretty_errors.rb +22 -0
- data/lib/facebooker/rails/facebook_request_fix.rb +28 -0
- data/lib/facebooker/rails/facebook_request_fix_2-3.rb +31 -0
- data/lib/facebooker/rails/facebook_session_handling.rb +68 -0
- data/lib/facebooker/rails/facebook_url_helper.rb +192 -0
- data/lib/facebooker/rails/facebook_url_rewriting.rb +60 -0
- data/lib/facebooker/rails/helpers.rb +870 -0
- data/lib/facebooker/rails/helpers/fb_connect.rb +122 -0
- data/lib/facebooker/rails/integration_session.rb +38 -0
- data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
- data/lib/facebooker/rails/publisher.rb +595 -0
- data/lib/facebooker/rails/routing.rb +49 -0
- data/lib/facebooker/rails/test_helpers.rb +68 -0
- data/lib/facebooker/rails/utilities.rb +22 -0
- data/lib/facebooker/server_cache.rb +24 -0
- data/lib/facebooker/service.rb +102 -0
- data/lib/facebooker/service/base_service.rb +19 -0
- data/lib/facebooker/service/curl_service.rb +44 -0
- data/lib/facebooker/service/net_http_service.rb +12 -0
- data/lib/facebooker/service/typhoeus_multi_service.rb +27 -0
- data/lib/facebooker/service/typhoeus_service.rb +17 -0
- data/lib/facebooker/session.rb +726 -0
- data/lib/facebooker/version.rb +9 -0
- data/lib/net/http_multipart_post.rb +123 -0
- data/lib/rack/facebook.rb +89 -0
- data/lib/tasks/facebooker.rake +18 -0
- data/lib/tasks/tunnel.rake +46 -0
- data/rails/init.rb +1 -0
- data/setup.rb +1585 -0
- data/templates/layout.erb +24 -0
- data/test/facebooker/adapters_test.rb +191 -0
- data/test/facebooker/admin_test.rb +102 -0
- data/test/facebooker/application_test.rb +41 -0
- data/test/facebooker/batch_request_test.rb +83 -0
- data/test/facebooker/data_test.rb +86 -0
- data/test/facebooker/logging_test.rb +43 -0
- data/test/facebooker/mobile_test.rb +45 -0
- data/test/facebooker/model_test.rb +133 -0
- data/test/facebooker/models/event_test.rb +15 -0
- data/test/facebooker/models/page_test.rb +46 -0
- data/test/facebooker/models/photo_test.rb +16 -0
- data/test/facebooker/models/user_test.rb +397 -0
- data/test/facebooker/rails/facebook_request_fix_2-3_test.rb +25 -0
- data/test/facebooker/rails/facebook_url_rewriting_test.rb +76 -0
- data/test/facebooker/rails/integration_session_test.rb +13 -0
- data/test/facebooker/rails/publisher_test.rb +519 -0
- data/test/facebooker/rails_integration_test.rb +1511 -0
- data/test/facebooker/server_cache_test.rb +44 -0
- data/test/facebooker/service_test.rb +58 -0
- data/test/facebooker/session_test.rb +883 -0
- data/test/facebooker_test.rb +951 -0
- data/test/net/http_multipart_post_test.rb +52 -0
- data/test/rack/facebook_test.rb +73 -0
- metadata +235 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
module Facebooker
|
|
2
|
+
|
|
3
|
+
class AdapterBase
|
|
4
|
+
class UnableToLoadAdapter < Exception; end
|
|
5
|
+
require 'active_support/inflector'
|
|
6
|
+
include ActiveSupport::CoreExtensions::String::Inflections
|
|
7
|
+
def facebook_path_prefix
|
|
8
|
+
"/" + (@facebook_path_prefix || canvas_page_name || ENV['FACEBOOK_CANVAS_PATH'] || ENV['FACEBOOKER_RELATIVE_URL_ROOT'])
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def facebook_path_prefix=(prefix)
|
|
12
|
+
@facebook_path_prefix = prefix
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def facebooker_config
|
|
16
|
+
@config
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def api_server_base_url
|
|
20
|
+
"http://" + api_server_base
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def is_for?(application_context)
|
|
24
|
+
raise "SubClassShouldDefine"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def initialize(config)
|
|
28
|
+
@config = config
|
|
29
|
+
@facebook_path_prefix = nil
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.facebooker_config
|
|
33
|
+
Facebooker.facebooker_config
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def self.load_adapter(params)
|
|
38
|
+
|
|
39
|
+
config_key_base = params[:config_key_base] # This allows for loading of a aspecific adapter
|
|
40
|
+
config_key_base += "_" if config_key_base && config_key_base.length > 0
|
|
41
|
+
|
|
42
|
+
unless api_key = (params[:fb_sig_api_key] || facebooker_config["#{config_key_base}api_key"])
|
|
43
|
+
raise Facebooker::AdapterBase::UnableToLoadAdapter
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
unless facebooker_config
|
|
47
|
+
return self.default_adapter(params)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
facebooker_config.each do |key,value|
|
|
51
|
+
next unless value == api_key
|
|
52
|
+
|
|
53
|
+
key_base = key.match(/(.*)[_]?api_key/)[1]
|
|
54
|
+
|
|
55
|
+
adapter_class_name = if !key_base || key_base.length == 0
|
|
56
|
+
"FacebookAdapter"
|
|
57
|
+
else
|
|
58
|
+
facebooker_config[key_base + "adapter"]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
adapter_class = "Facebooker::#{adapter_class_name}".constantize
|
|
62
|
+
|
|
63
|
+
# Collect the rest of the configuration
|
|
64
|
+
adapter_config = {}
|
|
65
|
+
facebooker_config.each do |key,value|
|
|
66
|
+
if (match = key.match(/#{key_base}[_]?(.*)/))
|
|
67
|
+
adapter_config[match[1]] = value
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
return adapter_class.new(adapter_config)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
return self.default_adapter(params)
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.default_adapter(params = {})
|
|
78
|
+
if facebooker_config.nil? || (facebooker_config.blank? rescue nil)
|
|
79
|
+
config = { "api_key" => ENV['FACEBOOK_API_KEY'], "secret_key" => ENV['FACEBOOK_SECRET_KEY']}
|
|
80
|
+
else
|
|
81
|
+
config = facebooker_config
|
|
82
|
+
end
|
|
83
|
+
FacebookAdapter.new(config)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
[:canvas_page_name, :api_key,:secret_key].each do |key_method|
|
|
87
|
+
define_method(key_method){ return facebooker_config[key_method.to_s]}
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
module Facebooker
|
|
2
|
+
class BeboAdapter < AdapterBase
|
|
3
|
+
|
|
4
|
+
def canvas_server_base
|
|
5
|
+
"apps.bebo.com"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def api_server_base
|
|
9
|
+
'apps.bebo.com'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def api_rest_path
|
|
13
|
+
"/restserver.php"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def is_for?(application_context)
|
|
17
|
+
application_context == :bebo
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def www_server_base_url
|
|
21
|
+
"www.bebo.com"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def login_url_base
|
|
26
|
+
"http://#{www_server_base_url}/SignIn.jsp?ApiKey=#{api_key}&v=1.0"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def install_url_base
|
|
30
|
+
"http://#{www_server_base_url}/c/apps/add?ApiKey=#{api_key}&v=1.0"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Things that don't actually work as expected in BEBO
|
|
36
|
+
module Facebooker
|
|
37
|
+
class User
|
|
38
|
+
def set_profile_fbml_with_bebo_adapter(profile_fbml, mobile_fbml, profile_action_fbml, profile_main = nil)
|
|
39
|
+
if(Facebooker.is_for?(:bebo))
|
|
40
|
+
self.session.post('facebook.profile.setFBML', :uid => @id, :markup => profile_fbml)
|
|
41
|
+
else
|
|
42
|
+
set_profile_fbml_without_bebo_adapter(profile_fbml,mobile_fbml, profile_action_fbml, profile_main)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
alias_method :set_profile_fbml_without_bebo_adapter, :set_profile_fbml
|
|
46
|
+
alias_method :set_profile_fbml, :set_profile_fbml_with_bebo_adapter
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
BEBO_FIELDS = FIELDS - [:meeting_sex, :wall_count, :meeting_for]
|
|
51
|
+
|
|
52
|
+
remove_method :collect
|
|
53
|
+
|
|
54
|
+
def collect(fields)
|
|
55
|
+
if(Facebooker.is_for?(:bebo) )
|
|
56
|
+
BEBO_FIELDS.reject{|field_name| !fields.empty? && !fields.include?(field_name)}.join(',')
|
|
57
|
+
else
|
|
58
|
+
FIELDS.reject{|field_name| !fields.empty? && !fields.include?(field_name)}.join(',')
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class PublishTemplatizedAction < Parser#:nodoc:
|
|
65
|
+
class <<self
|
|
66
|
+
def process_with_bebo_adapter(data)
|
|
67
|
+
if(Facebooker.is_for?(:bebo))
|
|
68
|
+
element('feed_publishTemplatizedAction_response', data).content
|
|
69
|
+
else
|
|
70
|
+
process_without_bebo_adapter(data)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
alias_method :process_without_bebo_adapter, :process
|
|
74
|
+
alias_method :process, :process_with_bebo_adapter
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
module Facebooker
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class FacebookAdapter < AdapterBase
|
|
5
|
+
|
|
6
|
+
def canvas_server_base
|
|
7
|
+
"apps.facebook.com"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def api_server_base
|
|
11
|
+
"api.facebook.com"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def video_server_base
|
|
15
|
+
"api-video.facebook.com"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def www_server_base_url
|
|
19
|
+
"www.facebook.com"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def api_rest_path
|
|
23
|
+
"/restserver.php"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def api_key
|
|
27
|
+
ENV['FACEBOOK_API_KEY'] || super
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def secret_key
|
|
31
|
+
ENV['FACEBOOK_SECRET_KEY'] || super
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def is_for?(application_context)
|
|
35
|
+
application_context == :facebook
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def login_url_base
|
|
41
|
+
"http://#{www_server_base_url}/login.php?api_key=#{api_key}&v=1.0"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def install_url_base
|
|
45
|
+
"http://#{www_server_base_url}/install.php?api_key=#{api_key}&v=1.0"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def connect_permission_url_base
|
|
49
|
+
"http://#{www_server_base_url}/connect/prompt_permissions.php?api_key=#{api_key}&v=1.0"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def permission_url_base
|
|
53
|
+
"http://#{www_server_base_url}/authorize.php?api_key=#{api_key}&v=1.0"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Facebooker
|
|
2
|
+
class Admin
|
|
3
|
+
def initialize(session)
|
|
4
|
+
@session = session
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
# ** BETA ***
|
|
8
|
+
# +properties+: Hash of properties you want to set
|
|
9
|
+
def set_app_properties(properties)
|
|
10
|
+
properties = properties.respond_to?(:to_json) ? properties.to_json : properties
|
|
11
|
+
(@session.post 'facebook.admin.setAppProperties', :properties => properties) == '1'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# ** BETA ***
|
|
15
|
+
# +properties+: Hash of properties you want to view.
|
|
16
|
+
def get_app_properties(*properties)
|
|
17
|
+
json = @session.post('facebook.admin.getAppProperties', :properties => properties.to_json)
|
|
18
|
+
hash = Facebooker.json_decode(CGI.unescapeHTML(json))
|
|
19
|
+
@properties = ApplicationProperties.from_hash(hash)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# ** BETA ***
|
|
23
|
+
# +restrictions+: Hash of restrictions you want to set.
|
|
24
|
+
def set_restriction_info(restrictions)
|
|
25
|
+
restrictions = restrictions.respond_to?(:to_json) ? restrictions.to_json : restrictions
|
|
26
|
+
(@session.post 'facebook.admin.setRestrictionInfo', :restriction_str => restrictions) == '1'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# ** BETA ***
|
|
30
|
+
def get_restriction_info(*restrictions)
|
|
31
|
+
json = @session.post('facebook.admin.getRestrictionInfo')
|
|
32
|
+
hash = Facebooker.json_decode(CGI.unescapeHTML(json))
|
|
33
|
+
@restrictions = ApplicationRestrictions.from_hash(hash)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Integration points include..
|
|
37
|
+
# :notifications_per_day, :requests_per_day, :emails_per_day, :email_disable_message_location
|
|
38
|
+
def get_allocation(integration_point)
|
|
39
|
+
@session.post('facebook.admin.getAllocation', :integration_point_name => integration_point.to_s).to_i
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Facebooker
|
|
2
|
+
class Application
|
|
3
|
+
def initialize(session)
|
|
4
|
+
@session = session
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
# +properties+: Hash of properties of the desired application. Specify exactly one of: application_id, application_api_key or application_canvas_name
|
|
8
|
+
# eg: application.get_public_info(:application_canvas_name => ENV['FACEBOOKER_RELATIVE_URL_ROOT'])
|
|
9
|
+
def get_public_info(properties)
|
|
10
|
+
(@session.post 'facebook.application.getPublicInfo', properties)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Facebooker
|
|
2
|
+
class BatchRequest
|
|
3
|
+
instance_methods.each { |m| undef_method m unless m =~ /(^__|^nil\?$|^send$|proxy_|^respond_to\?$|^new|object_id$)/ }
|
|
4
|
+
attr_reader :uri
|
|
5
|
+
attr_reader :method
|
|
6
|
+
class UnexecutedRequest < StandardError; end
|
|
7
|
+
def initialize(params,proc)
|
|
8
|
+
@exception = nil
|
|
9
|
+
@result = nil
|
|
10
|
+
@method = params[:method]
|
|
11
|
+
@uri = params.map{|k,v| "#{k}=#{CGI.escape(v.to_s)}"}.join("&")
|
|
12
|
+
@proc = proc
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def result=(result_object)
|
|
16
|
+
@result = @proc.nil? ? result_object : @proc.call(result_object)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def exception_raised=(ex)
|
|
20
|
+
@exception=ex
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def exception_raised?
|
|
24
|
+
@exception.nil? ? false : raise(@exception)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def respond_to?(name)
|
|
28
|
+
super || @result.respond_to?(name)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def ===(other)
|
|
32
|
+
other === @result
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def method_missing(name,*args,&proc)
|
|
36
|
+
if @exception
|
|
37
|
+
raise @exception
|
|
38
|
+
elsif @result.nil?
|
|
39
|
+
raise UnexecutedRequest.new("You must execute the batch before accessing the result: #{@uri}")
|
|
40
|
+
else
|
|
41
|
+
@result.send(name,*args,&proc)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module Facebooker
|
|
2
|
+
class Data
|
|
3
|
+
def initialize(session)
|
|
4
|
+
@session = session
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
##
|
|
8
|
+
# ** BETA ***
|
|
9
|
+
# Sets a cookie on Facebook
|
|
10
|
+
# +user+ The user for whom this cookie needs to be set.
|
|
11
|
+
# +name+ Name of the cookie
|
|
12
|
+
# +value+ Value of the cookie
|
|
13
|
+
# Optional:
|
|
14
|
+
# +expires+ Time when the cookie should expire. If not specified, the cookie never expires.
|
|
15
|
+
# +path+ Path relative to the application's callback URL, with which the cookie should be associated. (default value is /?
|
|
16
|
+
def set_cookie(user, name, value, expires=nil, path=nil)
|
|
17
|
+
@session.post('facebook.data.setCookie',
|
|
18
|
+
:uid => User.cast_to_facebook_id(user),
|
|
19
|
+
:name => name,
|
|
20
|
+
:value => value,
|
|
21
|
+
:expires => expires,
|
|
22
|
+
:path => path) {|response| response == '1'}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
##
|
|
26
|
+
# ** BETA ***
|
|
27
|
+
# Gets a cookie stored on Facebook
|
|
28
|
+
# +user+ The user from whom to get the cookies.
|
|
29
|
+
# Optional:
|
|
30
|
+
# +name+ The name of the cookie. If not specified, all the cookies for the given user get returned.
|
|
31
|
+
def get_cookies(user, name=nil)
|
|
32
|
+
@cookies = @session.post(
|
|
33
|
+
'facebook.data.getCookies', :uid => User.cast_to_facebook_id(user), :name => name) do |response|
|
|
34
|
+
response.map do |hash|
|
|
35
|
+
Cookie.from_hash(hash)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
##
|
|
41
|
+
# ** BETA ***
|
|
42
|
+
# Gets a preference stored on Facebook
|
|
43
|
+
# +pref_id+ The id of the preference to get
|
|
44
|
+
def get_preference(pref_id)
|
|
45
|
+
@session.post('facebook.data.getUserPreference', :pref_id=>pref_id)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
##
|
|
49
|
+
# ** BETA ***
|
|
50
|
+
# Sets a preference on Facebook
|
|
51
|
+
# +pref_id+ The id of the preference to set
|
|
52
|
+
# +value+ The value to set for this preference
|
|
53
|
+
def set_preference(pref_id, value)
|
|
54
|
+
@session.post('facebook.data.setUserPreference', :pref_id=>pref_id, :value=>value)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
module Facebooker
|
|
2
|
+
module Feed
|
|
3
|
+
METHODS = {'Action' => 'facebook.feed.publishActionOfUser', 'Story' => 'facebook.feed.publishStoryToUser',
|
|
4
|
+
'TemplatizedAction' => 'facebook.feed.publishTemplatizedAction' }
|
|
5
|
+
|
|
6
|
+
class ActionBase
|
|
7
|
+
1.upto(4) do |num|
|
|
8
|
+
attr_accessor "image_#{num}"
|
|
9
|
+
attr_accessor "image_#{num}_link"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def add_image(image,link=nil)
|
|
13
|
+
1.upto(4) do |num|
|
|
14
|
+
if send("image_#{num}").blank?
|
|
15
|
+
send("image_#{num}=",image)
|
|
16
|
+
send("image_#{num}_link=",link) unless link.nil?
|
|
17
|
+
return num
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
protected
|
|
24
|
+
def image_params
|
|
25
|
+
image_hash = {}
|
|
26
|
+
1.upto(4) do |num|
|
|
27
|
+
image_attribute = "image_#{num}"
|
|
28
|
+
image_link_attribute = image_attribute + "_link"
|
|
29
|
+
self.__send__(image_attribute) ? image_hash[image_attribute] = self.__send__(image_attribute) : nil
|
|
30
|
+
self.__send__(image_link_attribute) ? image_hash[image_link_attribute] = self.__send__(image_link_attribute) : nil
|
|
31
|
+
end
|
|
32
|
+
image_hash
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
# Representation of a templatized action to be published into a user's news feed
|
|
38
|
+
class TemplatizedAction < ActionBase
|
|
39
|
+
attr_accessor :page_actor_id, :title_template, :title_data, :body_template, :body_data, :body_general, :target_ids
|
|
40
|
+
|
|
41
|
+
def to_params
|
|
42
|
+
raise "Must set title_template" if self.title_template.nil?
|
|
43
|
+
{ :page_actor_id => page_actor_id,
|
|
44
|
+
:title_template => title_template,
|
|
45
|
+
:title_data => convert_json(title_data),
|
|
46
|
+
:body_template => body_template,
|
|
47
|
+
:body_data => convert_json(body_data),
|
|
48
|
+
:body_general => body_general,
|
|
49
|
+
:target_ids => target_ids }.merge image_params
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def convert_json(hash_or_string)
|
|
53
|
+
(hash_or_string.is_a?(Hash) and hash_or_string.respond_to?(:to_json)) ? hash_or_string.to_json : hash_or_string
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
##
|
|
58
|
+
# Representation of a story to be published into a user's news feed.
|
|
59
|
+
class Story < ActionBase
|
|
60
|
+
attr_accessor :title, :body
|
|
61
|
+
|
|
62
|
+
##
|
|
63
|
+
# Converts Story to a Hash of its attributes for use as parameters to Facebook REST API calls
|
|
64
|
+
def to_params
|
|
65
|
+
raise "Must set title before converting" if self.title.nil?
|
|
66
|
+
{ :title => title, :body => body }.merge image_params
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
Action = Story.dup
|
|
71
|
+
def Action.name
|
|
72
|
+
"Action"
|
|
73
|
+
end
|
|
74
|
+
##
|
|
75
|
+
# Representation of an action to be published into a user's news feed. Alias for Story.
|
|
76
|
+
class Action; end
|
|
77
|
+
end
|
|
78
|
+
end
|