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,44 @@
|
|
|
1
|
+
require 'benchmark'
|
|
2
|
+
module Facebooker
|
|
3
|
+
@@logger = nil
|
|
4
|
+
def self.logger=(logger)
|
|
5
|
+
@@logger = logger
|
|
6
|
+
end
|
|
7
|
+
def self.logger
|
|
8
|
+
@@logger
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module Logging
|
|
12
|
+
@skip_api_logging = nil
|
|
13
|
+
class << self; attr_accessor :skip_api_logging; end
|
|
14
|
+
|
|
15
|
+
def self.log_fb_api(method, params)
|
|
16
|
+
message = method # might customize later
|
|
17
|
+
dump = format_fb_params(params)
|
|
18
|
+
if block_given?
|
|
19
|
+
result = nil
|
|
20
|
+
seconds = Benchmark.realtime { result = yield }
|
|
21
|
+
log_info(message, dump, seconds) unless skip_api_logging
|
|
22
|
+
result
|
|
23
|
+
else
|
|
24
|
+
log_info(message, dump) unless skip_api_logging
|
|
25
|
+
nil
|
|
26
|
+
end
|
|
27
|
+
rescue Exception => e
|
|
28
|
+
exception = "#{e.class.name}: #{e.message}: #{dump}"
|
|
29
|
+
log_info(message, exception)
|
|
30
|
+
raise
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.format_fb_params(params)
|
|
34
|
+
params.map { |key,value| "#{key} = #{value}" }.join(', ')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.log_info(message, dump, seconds = 0)
|
|
38
|
+
return unless Facebooker.logger
|
|
39
|
+
log_message = "#{message} (#{seconds}) #{dump}"
|
|
40
|
+
Facebooker.logger.info(log_message)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Facebooker
|
|
2
|
+
class Mobile
|
|
3
|
+
def initialize(session)
|
|
4
|
+
@session = session
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
# Used to determine whether the user identified by "uid" has enabled SMS for this application.
|
|
8
|
+
def can_send(user)
|
|
9
|
+
@session.post('facebook.sms.canSend', :uid => User.cast_to_facebook_id(user))
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Send the given message to the user.
|
|
13
|
+
# See http://wiki.developers.facebook.com/index.php/Mobile
|
|
14
|
+
def send(user, message)
|
|
15
|
+
@session.post('facebook.sms.send',
|
|
16
|
+
{:uid => User.cast_to_facebook_id(user),
|
|
17
|
+
:message => message}, false)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'digest/md5'
|
|
2
|
+
require 'facebooker/service'
|
|
3
|
+
|
|
4
|
+
module Facebooker
|
|
5
|
+
# A mock service that reads the Facebook response from fixtures
|
|
6
|
+
# Adapted from http://gist.github.com/44344
|
|
7
|
+
#
|
|
8
|
+
# Facebooker::MockService.fixture_path = 'path/to/dir'
|
|
9
|
+
# Facebooker::Session.current = Facebooker::MockSession.create
|
|
10
|
+
#
|
|
11
|
+
class MockService < Service
|
|
12
|
+
class << self
|
|
13
|
+
attr_accessor :fixture_path
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def read_fixture(method, filename, original = nil)
|
|
17
|
+
path = fixture_path(method, filename)
|
|
18
|
+
File.read path
|
|
19
|
+
rescue Errno::ENAMETOOLONG
|
|
20
|
+
read_fixture(method, hash_fixture_name(filename), filename)
|
|
21
|
+
rescue Errno::ENOENT => e
|
|
22
|
+
if File.exists?(fixture_path(method, 'default'))
|
|
23
|
+
File.read fixture_path(method, 'default')
|
|
24
|
+
else
|
|
25
|
+
e.message << "\n(Non-hashed path is #{original})" if original
|
|
26
|
+
e.message << "\nFacebook API Reference: http://wiki.developers.facebook.com/index.php/#{method.sub(/^facebook\./, '')}#Example_Return_XML"
|
|
27
|
+
raise e
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def post(params)
|
|
32
|
+
method = params.delete(:method)
|
|
33
|
+
params.delete_if {|k,_| [:v, :api_key, :call_id, :sig].include?(k) }
|
|
34
|
+
Parser.parse(method, read_fixture(method, fixture_name(params)))
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
def fixture_path(method, filename)
|
|
39
|
+
File.join(self.class.fixture_path, method, "#{filename}.xml")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def hash_fixture_name(filename)
|
|
43
|
+
Digest::MD5.hexdigest(filename)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def fixture_name(params)
|
|
47
|
+
params.map {|*args| args.join('=') }.sort.join('&')
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'facebooker/session'
|
|
2
|
+
|
|
3
|
+
module Facebooker
|
|
4
|
+
class MockSession < Session
|
|
5
|
+
def secured?
|
|
6
|
+
true
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def secure!
|
|
10
|
+
@uid = 1
|
|
11
|
+
true
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def service
|
|
15
|
+
@service ||= MockService.new(Facebooker.api_server_base, Facebooker.api_rest_path, @api_key)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
module Facebooker
|
|
2
|
+
##
|
|
3
|
+
# helper methods primarily supporting the management of Ruby objects which are populatable via Hashes.
|
|
4
|
+
# Since most Facebook API calls accept and return hashes of data (as XML), the Model module allows us to
|
|
5
|
+
# directly populate a model's attributes given a Hash with matching key names.
|
|
6
|
+
module Model
|
|
7
|
+
class UnboundSessionException < Exception; end
|
|
8
|
+
def self.included(includer)
|
|
9
|
+
includer.extend ClassMethods
|
|
10
|
+
includer.__send__(:attr_writer, :session)
|
|
11
|
+
includer.__send__(:attr_reader, :anonymous_fields)
|
|
12
|
+
end
|
|
13
|
+
module ClassMethods
|
|
14
|
+
##
|
|
15
|
+
# Instantiate a new instance of the class into which we are included and populate that instance's
|
|
16
|
+
# attributes given the provided Hash. Key names in the Hash should map to attribute names on the model.
|
|
17
|
+
def from_hash(hash)
|
|
18
|
+
instance = new(hash)
|
|
19
|
+
yield instance if block_given?
|
|
20
|
+
instance
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
# Create a standard attr_writer and a populating_attr_reader
|
|
25
|
+
def populating_attr_accessor(*symbols)
|
|
26
|
+
attr_writer(*symbols)
|
|
27
|
+
populating_attr_reader(*symbols)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
##
|
|
31
|
+
# Create a reader that will attempt to populate the model if it has not already been populated
|
|
32
|
+
def populating_attr_reader(*symbols)
|
|
33
|
+
symbols.each do |symbol|
|
|
34
|
+
define_method(symbol) do
|
|
35
|
+
populate unless populated?
|
|
36
|
+
instance_variable_get("@#{symbol}")
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def populating_hash_settable_accessor(symbol, klass)
|
|
42
|
+
populating_attr_reader symbol
|
|
43
|
+
hash_settable_writer(symbol, klass)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def populating_hash_settable_list_accessor(symbol, klass)
|
|
47
|
+
populating_attr_reader symbol
|
|
48
|
+
hash_settable_list_writer(symbol, klass)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
#
|
|
52
|
+
# Declares an attribute named ::symbol:: which can be set with either an instance of ::klass::
|
|
53
|
+
# or a Hash which will be used to populate a new instance of ::klass::.
|
|
54
|
+
def hash_settable_accessor(symbol, klass)
|
|
55
|
+
attr_reader symbol
|
|
56
|
+
hash_settable_writer(symbol, klass)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def hash_settable_writer(symbol, klass)
|
|
60
|
+
define_method("#{symbol}=") do |value|
|
|
61
|
+
instance_variable_set("@#{symbol}", value.kind_of?(Hash) ? klass.from_hash(value) : value)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
#
|
|
66
|
+
# Declares an attribute named ::symbol:: which can be set with either a list of instances of ::klass::
|
|
67
|
+
# or a list of Hashes which will be used to populate a new instance of ::klass::.
|
|
68
|
+
def hash_settable_list_accessor(symbol, klass)
|
|
69
|
+
attr_reader symbol
|
|
70
|
+
hash_settable_list_writer(symbol, klass)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def hash_settable_list_writer(symbol, klass)
|
|
74
|
+
define_method("#{symbol}=") do |list|
|
|
75
|
+
instance_variable_set("@#{symbol}", list.map do |item|
|
|
76
|
+
item.kind_of?(Hash) ? klass.from_hash(item) : item
|
|
77
|
+
end)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def id_is(attribute)
|
|
82
|
+
(file, line) = caller.first.split(':')
|
|
83
|
+
|
|
84
|
+
class_eval(<<-EOS, file, line.to_i)
|
|
85
|
+
def #{attribute}=(value)
|
|
86
|
+
@#{attribute} = value.to_i
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
attr_reader #{attribute.inspect}
|
|
90
|
+
alias :id #{attribute.inspect}
|
|
91
|
+
alias :id= #{"#{attribute}=".to_sym.inspect}
|
|
92
|
+
EOS
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
##
|
|
97
|
+
# Centralized, error-checked place for a model to get the session to which it is bound.
|
|
98
|
+
# Any Facebook API queries require a Session instance.
|
|
99
|
+
def session
|
|
100
|
+
@session || (raise UnboundSessionException, "Must bind this object to a Facebook session before querying")
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
#
|
|
104
|
+
# This gets populated from FQL queries.
|
|
105
|
+
def anon=(value)
|
|
106
|
+
@anonymous_fields = value
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def initialize(hash = {})
|
|
110
|
+
populate_from_hash!(hash)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def populate
|
|
114
|
+
raise NotImplementedError, "#{self.class} included me and should have overriden me"
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def populated?
|
|
118
|
+
@populated
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
##
|
|
122
|
+
# Set model's attributes via Hash. Keys should map directly to the model's attribute names.
|
|
123
|
+
def populate_from_hash!(hash)
|
|
124
|
+
unless hash.nil? || hash.empty?
|
|
125
|
+
hash.each do |key, value|
|
|
126
|
+
set_attr_method = "#{key}="
|
|
127
|
+
unless value.nil?
|
|
128
|
+
if respond_to?(set_attr_method)
|
|
129
|
+
self.__send__(set_attr_method, value)
|
|
130
|
+
else
|
|
131
|
+
Facebooker::Logging.log_info("**Warning**, Attempt to set non-attribute: #{key}",hash)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
@populated = true
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
require 'facebooker/model'
|
|
2
|
+
module Facebooker
|
|
3
|
+
##
|
|
4
|
+
# Represents a user's affiliation, for example, which educational institutions
|
|
5
|
+
# the user is associated with.
|
|
6
|
+
class Affiliation
|
|
7
|
+
include Model
|
|
8
|
+
attr_accessor :name, :status, :type, :year, :nid
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'facebooker/model'
|
|
2
|
+
module Facebooker
|
|
3
|
+
##
|
|
4
|
+
# A simple representation of a photo album.
|
|
5
|
+
class Album
|
|
6
|
+
include Model
|
|
7
|
+
attr_accessor :aid, :cover_pid, :owner, :name, :created,
|
|
8
|
+
:modified, :description, :location, :link, :size, :visible
|
|
9
|
+
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module Facebooker
|
|
2
|
+
|
|
3
|
+
# application_name string The name of your application.
|
|
4
|
+
# callback_url string Your application's callback URL. The callback URL cannot be longer than 100 characters.
|
|
5
|
+
# post_install_url string The URL where a user gets redirected after installing your application. The post-install URL cannot be longer than 100 characters.
|
|
6
|
+
# edit_url string
|
|
7
|
+
# dashboard_url string
|
|
8
|
+
# uninstall_url string The URL where a user gets redirected after removing your application.
|
|
9
|
+
# ip_list string For Web-based applications, these are the IP addresses of your servers that can access Facebook's servers and serve information to your application.
|
|
10
|
+
# email string The email address associated with the application; the email address Facebook uses to contact you about your application. (default value is your Facebook email address.)
|
|
11
|
+
# description string The description of your application.
|
|
12
|
+
# use_iframe bool Indicates whether you render your application with FBML (0) or in an iframe (1). (default value is 1)
|
|
13
|
+
# desktop bool Indicates whether your application is Web-based (0) or gets installed on a user's desktop (1). (default value is 1)
|
|
14
|
+
# is_mobile bool Indicates whether your application can run on a mobile device (1) or not (0). (default value is 1)
|
|
15
|
+
# default_fbml string The default FBML code that appears in the user's profile box when he or she adds your application.
|
|
16
|
+
# default_column bool Indicates whether your application appears in the wide (1) or narrow (0) column of a user's Facebook profile. (default value is 1)
|
|
17
|
+
# message_url string For applications that can create attachments, this is the URL where you store the attachment's content.
|
|
18
|
+
# message_action string For applications that can create attachments, this is the label for the action that creates the attachment. It cannot be more than 20 characters.
|
|
19
|
+
# about_url string This is the URL to your application's About page. About pages are now Facebook Pages.
|
|
20
|
+
# private_install bool Indicates whether you want to disable (1) or enable (0) News Feed and Mini-Feed stories when a user installs your application. (default value is 1)
|
|
21
|
+
# installable bool Indicates whether a user can (1) or cannot (0) install your application. (default value is 1)
|
|
22
|
+
# privacy_url string The URL to your application's privacy terms.
|
|
23
|
+
# help_url string The URL to your application's help page.
|
|
24
|
+
# see_all_url string
|
|
25
|
+
# tos_url string The URL to your application's Terms of Service.
|
|
26
|
+
# dev_mode bool Indicates whether developer mode is enabled (1) or disabled (0). Only developers can install applications in developer mode. (default value is 1)
|
|
27
|
+
# preload_fql string A preloaded FQL query.
|
|
28
|
+
class ApplicationProperties
|
|
29
|
+
include Model
|
|
30
|
+
FIELDS = [ :application_name, :callback_url, :post_install_url, :edit_url, :dashboard_url,
|
|
31
|
+
:uninstall_url, :ip_list, :email, :description, :use_iframe, :desktop, :is_mobile,
|
|
32
|
+
:default_fbml, :default_column, :message_url, :message_action, :about_url,
|
|
33
|
+
:private_install, :installable, :privacy_url, :help_url, :see_all_url, :tos_url,
|
|
34
|
+
:dev_mode, :preload_fql, :icon_url, :canvas_name, :logo_url, :connect_logo_url ]
|
|
35
|
+
|
|
36
|
+
attr_accessor(*FIELDS)
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'facebooker/model'
|
|
2
|
+
module Facebooker
|
|
3
|
+
class Event
|
|
4
|
+
|
|
5
|
+
##
|
|
6
|
+
# The relationship between a Facebook user and an Event to which he or she has been
|
|
7
|
+
# invited and may or may not be attending (based on #rsvp_status)
|
|
8
|
+
class Attendance
|
|
9
|
+
include Model
|
|
10
|
+
attr_accessor :eid, :uid, :rsvp_status
|
|
11
|
+
|
|
12
|
+
##
|
|
13
|
+
# Get the full, populated Event object which this Attendance is associated with.
|
|
14
|
+
# First access will query the Facebook API (facebook.events.get). Subsequent
|
|
15
|
+
# calls are retrieved from in-memory cache.
|
|
16
|
+
def event
|
|
17
|
+
@event ||= Event.from_hash(session.post('facebook.events.get', :eids => [eid]).first)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
#TODO: implement user() method
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
include Model
|
|
24
|
+
attr_accessor :pic, :pic_small, :pic_big, :name, :creator, :update_time, :description, :tagline, :venue, :host, :event_type, :nid, :location, :end_time, :start_time, :event_subtype
|
|
25
|
+
|
|
26
|
+
id_is :eid
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'facebooker/model'
|
|
2
|
+
module Facebooker
|
|
3
|
+
##
|
|
4
|
+
# A simple representation of a friend list.
|
|
5
|
+
class FriendList
|
|
6
|
+
include Model
|
|
7
|
+
attr_accessor :name
|
|
8
|
+
|
|
9
|
+
id_is :flid
|
|
10
|
+
|
|
11
|
+
# We need this to be an integer, so do the conversion
|
|
12
|
+
def flid=(f)
|
|
13
|
+
@flid= ( f.nil? ? nil : f.to_i)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'facebooker/model'
|
|
2
|
+
module Facebooker
|
|
3
|
+
class Group
|
|
4
|
+
##
|
|
5
|
+
# The model of a user's relationship to a group. Users can occupy different positions within a group (e.g. 'owner')
|
|
6
|
+
class Membership
|
|
7
|
+
include Model
|
|
8
|
+
attr_accessor :position, :gid, :uid
|
|
9
|
+
end
|
|
10
|
+
include Model
|
|
11
|
+
attr_accessor :pic, :pic_small, :pic_big, :name, :creator, :recent_news, :update_time, :group_subtype, :group_type, :website, :office, :description, :venue, :nid, :privacy
|
|
12
|
+
|
|
13
|
+
id_is :gid
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
# Get the full list of members as populated User objects. First time fetches group members via Facebook API call.
|
|
17
|
+
# Subsequent calls return cached values.
|
|
18
|
+
# This is a convenience method for getting all of the Membership instances and instantiating User instances for each Membership.
|
|
19
|
+
def members
|
|
20
|
+
@members ||= memberships.map do |membership|
|
|
21
|
+
User.new(membership.uid, session)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
##
|
|
26
|
+
# Get a list of Membership instances associated with this Group. First call retrieves the Membership instances via a Facebook
|
|
27
|
+
# API call. Subsequent calls are retrieved from in-memory cache.
|
|
28
|
+
def memberships
|
|
29
|
+
@memberships ||= session.post('facebook.groups.getMembers', :gid => gid).map do |hash|
|
|
30
|
+
Membership.from_hash(hash) do |membership|
|
|
31
|
+
membership.gid = gid
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|