mogli 0.0.16 → 0.0.17

Sign up to get free protection for your applications and to get access to all the features.
@@ -30,6 +30,18 @@ module Mogli
30
30
  :client_secret => secret,
31
31
  :sessions => keystr})
32
32
  end
33
+
34
+ def get_access_token_for_application
35
+ client = Mogli::Client.new
36
+ request = client.class.post(client.api_path('oauth/access_token'),
37
+ :body=> {
38
+ :grant_type => 'client_credentials',
39
+ :client_id => client_id,
40
+ :client_secret => secret
41
+ }
42
+ )
43
+ request.parsed_response.split('=').last
44
+ end
33
45
 
34
46
  end
35
47
  end
data/lib/mogli/client.rb CHANGED
@@ -17,6 +17,8 @@ module Mogli
17
17
  class OAuthAccessTokenException < ClientException; end
18
18
  class OAuthUnauthorizedClientException < ClientException; end
19
19
  class OAuthException < ClientException; end
20
+ # represents case that the facebook limit on posts to a feed has been exceeded
21
+ class FeedActionRequestLimitExceeded < ClientException; end
20
22
 
21
23
  def api_path(path)
22
24
  "https://graph.facebook.com/#{path}"
@@ -52,12 +54,16 @@ module Mogli
52
54
  end
53
55
 
54
56
  def self.raise_client_exception(post_data)
55
- type=post_data["error"]["type"]
56
- message=post_data["error"]["message"]
57
- if Mogli::Client.const_defined?(type)
58
- raise Mogli::Client.const_get(type).new(message)
57
+ raise_error_by_type_and_message(post_data["error"]["type"], post_data["error"]["message"])
58
+ end
59
+
60
+ def self.raise_error_by_type_and_message(type, message)
61
+ if type == 'OAuthException' && message =~ /Feed action request limit reached/
62
+ raise FeedActionRequestLimitExceeded.new(message)
63
+ elsif Mogli::Client.const_defined?(type)
64
+ raise Mogli::Client.const_get(type).new(message)
59
65
  else
60
- raise ClientException.new("#{type}: #{message}")
66
+ raise ClientException.new("#{type}: #{message}")
61
67
  end
62
68
  end
63
69
 
@@ -73,6 +79,12 @@ module Mogli
73
79
  new(access_data['access_token'],
74
80
  Time.now.to_i + access_data['expires'].to_i)
75
81
  end
82
+
83
+ def self.create_and_authenticate_as_application(client_id, secret)
84
+ authenticator = Mogli::Authenticator.new(client_id, secret, nil)
85
+ access_data = authenticator.get_access_token_for_application
86
+ new(access_data)
87
+ end
76
88
 
77
89
  def post(path,klass,body_args)
78
90
  data = self.class.post(api_path(path),:body=>default_params.merge(body_args))
@@ -158,10 +170,7 @@ module Mogli
158
170
  def raise_error_if_necessary(data)
159
171
  if data.kind_of?(Hash)
160
172
  if data.keys.size == 1 and data["error"]
161
- type = data["error"]["type"]
162
- message = data["error"]["message"]
163
- raise Mogli::Client.const_get(type).new(message) if Mogli::Client.const_defined?(type)
164
- raise ClientException.new("#{type}: #{message}")
173
+ self.class.raise_error_by_type_and_message(data["error"]["type"], data["error"]["message"])
165
174
  end
166
175
  end
167
176
  end
data/lib/mogli/page.rb CHANGED
@@ -5,7 +5,7 @@ module Mogli
5
5
  define_properties :id, :name, :category, :username, :access_token
6
6
 
7
7
  # General
8
- define_properties :fan_count, :link, :picture, :has_added_app
8
+ define_properties :likes, :link, :picture, :has_added_app, :website, :description, :can_post
9
9
 
10
10
  # Retail
11
11
  define_properties :founded, :products, :mission, :company_overview
data/lib/mogli/user.rb CHANGED
@@ -26,5 +26,91 @@ module Mogli
26
26
  has_association :likes, "Page"
27
27
  has_association :home, "Post"
28
28
  has_association :accounts, "Page"
29
+
30
+ attr_reader :extended_permissions
31
+
32
+ # raised when asked to check for a permission that mogli doesn't know about
33
+ class UnrecognizedExtendedPermissionException < Exception; end
34
+
35
+ # the entire list of extended permissions the user is able to grant the
36
+ # application. the list should be kept in sync with
37
+ # http://developers.facebook.com/docs/authentication/permissions
38
+ ALL_EXTENDED_PERMISSIONS = [
39
+ # publishing permissions
40
+ :publish_stream,
41
+ :create_event,
42
+ :rsvp_event,
43
+ :sms,
44
+ :offline_access,
45
+ :publish_checkins,
46
+
47
+ # data permissions
48
+ :user_about_me,
49
+ :user_activities,
50
+ :user_birthday,
51
+ :user_education_history,
52
+ :user_events,
53
+ :user_groups,
54
+ :user_hometown,
55
+ :user_interests,
56
+ :user_likes,
57
+ :user_location,
58
+ :user_notes,
59
+ :user_online_presence,
60
+ :user_photo_video_tags,
61
+ :user_photos,
62
+ :user_relationships,
63
+ :user_relationship_details,
64
+ :user_religion_politics,
65
+ :user_status,
66
+ :user_videos,
67
+ :user_website,
68
+ :user_work_history,
69
+ :email,
70
+ :read_friendlists,
71
+ :read_insights,
72
+ :read_mailbox,
73
+ :read_requests,
74
+ :read_stream,
75
+ :xmpp_login,
76
+ :ads_management,
77
+ :user_checkins,
78
+
79
+ # page permissions
80
+ :manage_pages
81
+ ]
82
+
83
+ # check if the facebook user has a specific permission. the permission arg
84
+ # is a symbol matching the facebook extended permission names exactly:
85
+ # http://developers.facebook.com/docs/authentication/permissions
86
+ def has_permission?(permission)
87
+ if !ALL_EXTENDED_PERMISSIONS.include? permission
88
+ raise UnrecognizedExtendedPermissionException,
89
+ "The requested permission is not recognized as a facebook extended permission: '#{permission}'"
90
+ end
91
+
92
+ if !defined?(@extended_permissions)
93
+ fetch_permissions
94
+ end
95
+
96
+ extended_permissions[permission]
97
+ end
98
+
99
+ private
100
+
101
+ # queries all extended permissions for this user for the current application
102
+ # caches a hash of permission names => boolean indicating if the user has
103
+ # granted the specified permission to this app
104
+ def fetch_permissions
105
+ fql = "SELECT #{ALL_EXTENDED_PERMISSIONS.map(&:to_s).join(',')} " +
106
+ "FROM permissions " +
107
+ "WHERE uid = #{self.id}"
108
+ @extended_permissions = {}
109
+ perms_query_result = client.fql_query(fql).parsed_response.first
110
+ ALL_EXTENDED_PERMISSIONS.each do |perm|
111
+ @extended_permissions[perm] = (perms_query_result[perm.to_s] == 1)
112
+ end
113
+ end
114
+
29
115
  end
30
116
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mogli
3
3
  version: !ruby/object:Gem::Version
4
- hash: 63
4
+ hash: 61
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 16
10
- version: 0.0.16
9
+ - 17
10
+ version: 0.0.17
11
11
  platform: ruby
12
12
  authors:
13
13
  - Mike Mangino
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-08 00:00:00 -05:00
18
+ date: 2011-01-11 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency