lib/social_profile/people/facebook.rb in social_profile-0.1.4 vs lib/social_profile/people/facebook.rb in social_profile-0.2.0
- old
+ new
@@ -1,20 +1,103 @@
-# encoding: utf-8
require "fb_graph"
module SocialProfile
module People
class Facebook < Person
+ FRIENDS_FQL = "SELECT friend_count FROM user WHERE uid=me()"
+ FIRST_POST_FQL = "SELECT created_time FROM stream WHERE source_id = me() AND created_time < {date} limit 1"
+ LAST_POSTS_FIELDS = [
+ "comments.fields(created_time).limit(1).summary(true)",
+ "likes.limit(1).fields(id).summary(true)",
+ "created_time",
+ "shares"
+ ]
+
# Find album by id
def fetch_album(album_id)
::FbGraph::Album.fetch(album_id, :access_token => access_token)
end
# Create new album id
def album!(options = {})
user.album!(options)
end
-
+
+ # Get friends count
+ #
+ def friends_count
+ @friends_count ||= fetch_friends_count
+ end
+
+ # Get followers count
+ #
+ def followers_count
+ @followers_count ||= followers(:limit => 1).total_count
+ end
+
+ def fetch_friends_count
+ response = FbGraph::Query.new(FRIENDS_FQL).fetch(:access_token => access_token)
+
+ response = response.first if response.is_a?(Array)
+ return nil if response.is_a?(Hash) && response["friend_count"].blank?
+
+ response["friend_count"].to_i
+ end
+
+ # Check if exists any post before current year
+ #
+ def first_post_exists?(year)
+ timestamp = Time.new(year, 1, 1).utc.to_i
+
+ _sql = FIRST_POST_FQL.gsub('{date}', timestamp.to_s)
+ response = FbGraph::Query.new(_sql).fetch(:access_token => access_token)
+
+ response = response.first if response.is_a?(Array)
+ return nil if response.nil? || (response.is_a?(Hash) && response["created_time"].blank?)
+
+ response["created_time"].to_i
+ end
+
+ # Get last limited posts from feed with comments, shares and likes counters
+ #
+ def last_posts(limit, options = {})
+ fields = options[:fields] || LAST_POSTS_FIELDS
+
+ user.feed(:fields => fields.join(","), :limit => limit)
+ end
+
+ # Get last post by days from feed with comments, shares and likes counters
+ #
+ def last_post_by_days(days, options={})
+ date = (options[:date_end] || Time.now) - days.days
+ limit = options[:limit] || 100
+
+ posts = collection = last_posts(limit, options)
+ last_created_time = posts.last.created_time
+
+ while last_created_time > date
+ collection = collection.next
+ posts += collection
+ last_created_time = posts.last.created_time
+ end
+
+ posts.select { |p| p.created_time > date }
+ end
+
+ # Get all friends list
+ #
+ def friends(options={})
+ limit = options[:limit] || 500000
+ user.friends(:limit => limit)
+ end
+
+ # Get all followers list
+ #
+ def followers(options={})
+ limit = options[:limit] || 500000
+ user.subscribers(:limit => limit)
+ end
+
protected
def user
@user ||= ::FbGraph::User.me(access_token)
end
\ No newline at end of file