lib/pupil.rb in pupil-0.0.6 vs lib/pupil.rb in pupil-0.1.0
- old
+ new
@@ -1,662 +1,20 @@
# -*- coding: utf-8 -*-
-require 'net/http'
-require 'rexml/document'
-require 'uri'
-require 'rubygems' if RUBY_VERSION < '1.9.0'
-require 'oauth'
-#require 'pp'
+require "net/http"
+require "uri"
+require "pp"
+require "rubygems" if RUBY_VERSION < "1.9.0"
+require "json"
+require "oauth"
-$LOAD_PATH << File.dirname(File.expand_path(__FILE__)) if RUBY_VERSION >= '1.9.0'
-require 'pupil/keygen'
-
-class Pupil
- attr_reader :screen_name
- class UnsupportedParameter < StandardError; end
-
- # @param [Hash] pupil_key
- def initialize(pupil_key)
- @screen_name = pupil_key[:screen_name]
- @client = nil
- @config = nil
- consumer = OAuth::Consumer.new(
- pupil_key[:consumer_key],
- pupil_key[:consumer_secret],
- :site => 'http://api.twitter.com'
- )
- @access_token = OAuth::AccessToken.new(
- consumer,
- pupil_key[:access_token],
- pupil_key[:access_token_secret]
- )
- end
-
- # @param [Hash] parameter
- # @return [String] URL Serialized parameters
- def param_serializer parameter
- ant = Hash.new
- parameter.each do |key, value|
- case key.to_sym
- when :include
- if value.class == String || Symbol
- ant[:"include_#{value}"] = :true
- break
- end
-
- value.each do |element|
- raise UnsupportedParameter, 'include_entities is not supported.' if element.to_sym == :entities
- ant[:"include_#{element}"] = :true
- end
- when :exclude
- if value.class == String || Symbol
- ant[:"exclude_#{value}"] = :true
- break
- end
-
- value.each do |element|
- ant[:"exclude_#{element}"] = :true
- end
- else
- ant[key.to_sym] = value
- end
- end
- param = ant.inject(""){|k,v|k+"&#{v[0]}=#{v[1]}"}.sub!(/^&/,"?")
- return param ? param : ""
- end
-
- class REXML::Document
- def is_error?
- if self.root.get_text("error") then
- return true
- else
- return false
- end
- end
-
- def get_error_message
- return self.root.get_text("error")
- end
- end
-
- public
-
- # @return [Hash] User credentials
- def verify_credentials
- response = @access_token.get('/account/verify_credentials.xml')
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- user = User.new(doc.elements['/user'])
- return user
- end
-
- # Alias to Pupil#home_timeline
- # @param [Hash] param
- # @return [Array] Timeline
- # @deprecated Use {#home_timeline} instead of this method because
- # is was obsoleted.
- def friends_timeline(param = {})
- param_s = param_serializer(param)
- begin
- response = @access_token.get("http://api.twitter.com/1/statuses/friends_timeline.xml"+param_s)
- rescue
- return false
- end
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- statuses = Array.new
-
- doc.get_elements('/statuses/status').each do |element|
- status = Status.new(element)
- statuses << status
- end
-
- return statuses
- end
-
- # @param [Hash] param
- # @return [Array] Timeline
- def home_timeline(param = {})
- param_s = param_serializer(param)
- begin
- response = @access_token.get("http://api.twitter.com/1/statuses/home_timeline.xml"+param_s)
- rescue
- return false
- end
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- statuses = Array.new
- doc.get_elements('/statuses/status').each{|element|
- status = Status.new(element)
- statuses << status
- }
- return statuses
- end
-
- # Returning user timeline
- # @param [Hash] param
- # @return [Hash] timeline
- # @option param [Fixnum] :user_id The ID of user
- # @option param [String] :screen_name The Screen name of user
- # @option param [Fixnum] :since_id
- # @option param [Fixnum] :max_id
- # @option param [Fixnum] :count
- # @option param [Fixnum] :page Specifies
- # @option param [Symbol] :trim_user
- # @option param [Symbol] :include #=> [:rts]
- # @option param [Symbol] :exclude #=> [:replies]
- # @option param [Symbol] :contributor_details
- # @example
- # twitter = Pupil.new PUPIL_KEY
- # twitter.user_timeline(:screen_name => 'o_ame', :exclude => :replies).each do |status|
- # puts "#{status.user.screen_name}: #{status.text}"
- # end
- def user_timeline(param = {})
- param_s = param_serializer(param)
- begin
- response = @access_token.get("http://api.twitter.com/1/statuses/user_timeline.xml"+param_s)
- rescue
- return false
- end
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- statuses = Array.new
- doc.get_elements('/statuses/status').each{|element|
- status = Status.new(element)
- statuses << status
- }
- return statuses
- end
-
- # @param [Hash] param
- # @return [Hash] mention
- def mentions(param = {})
- param_s = param_serializer(param)
- begin
- response = @access_token.get("http://api.twitter.com/1/statuses/mentions.xml"+param_s)
- rescue
- return false
- end
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- statuses = Array.new
-
- doc.get_elements('/statuses/status').each{|element|
- status = Status.new(element)
- statuses << status
- }
-
- return statuses
- end
-
- # Returning direct messages
- # @param [Hash] param
- # @return [Hash] directmessages
- def dm(param = {})
- param_s = param_serializer(param)
- begin
- response = @access_token.get("http://api.twitter.com/1/direct_messages.xml"+param_s)
- rescue
- return false
- end
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- directmessages = Array.new
-
- doc.get_elements('/direct-messages/direct_message').each{|element|
- dm = DirectMessage.new(element)
- directmessages << dm
- }
-
- return directmessages
- end
-
- # Returning direct messages you sent
- # @param [Hash] param
- # @return [Hash] directmessage you sent
- def dm_sent(param = {})
- param_s = param_serializer(param)
- begin
- response = @access_token.get("http://api.twitter.com/1/direct_messages/sent.xml"+param_s)
- rescue
- return false
- end
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- directmessages = Array.new
-
- doc.get_elements('/direct-messages/direct_message').each{|element|
- dm = DirectMessage.new(element)
- directmessages << dm
- }
-
- return directmessages
- end
-
- # Delete direct message
- # @param [Fixnum] dm_id message id that you want to delete
- # @return [Hash] response
- def dm_destroy(dm_id)
- begin
- response = @access_token.post("http://api.twitter.com/1/direct_messages/destroy/#{dm_id}.xml")
- rescue
- return false
- end
- return response
- end
-
- # Check friendships
- # @param [String] src source user
- # @param [String] dst destination user
- # @return [Boolean] return true if paired users have friendship, or ruturn false
- def friendship_exists?(src, dst)
- begin
- response = @access_token.get("http://api.twitter.com/1/friendships/exists.xml?user_a=#{src}&user_b=#{dst}")
- rescue
- return false
- end
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- if doc.elements["friends"].text() == "true" then
- return true
- else
- return false
- end
- end
-
- # Follow user for screen_name
- # @param [String] name screen_name
- # @return [Hash] response
- def follow name
- begin
- response = @access_token.post("http://api.twitter.com/1/friendships/create/#{name}.xml")
- rescue
- return false
- end
- return response
- end
-
- # Unfollow user for screen_name
- # @param [String] name screen_name
- # @return [Hash] response
- def unfollow name
- begin
- response = @access_token.post("http://api.twitter.com/1/friendships/destroy/#{name}.xml")
- rescue
- return false
- end
- return response
- end
-
- # @param [Fixnum] id id
- # @return [Hash] response
- def block(id)
- begin
- response = @access_token.post("http://api.twitter.com/1/blocks/create.xml?id=#{id}")
- rescue
- return false
- end
- return response
- end
-
- # @param [Fixnum] id id
- # @return [Hash] response
- def unblock(id)
- begin
- response = @access_token.post("http://api.twitter.com/1/blocks/destroy.xml?id=#{id}")
- rescue
- return false
- end
- return response
- end
-
- # @return [Hash] list of blocking users
- def blocking
- response = @access_token.get("http://api.twitter.com/1/blocks/blocking.xml")
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- users = Array.new
- doc.get_elements('/users/user').each{|element|
- user = User.new(element)
- users << user
- }
- return users
- end
-
- # @param [Fixnum] id list id
- # @param [String] ids id comma separated
- # @return [Hash] response
- def addlist(listid,ids)
- response = @access_token.post("http://api.twitter.com/1/#{@username}/#{listid}/create_all.xml?user_id=#{ids}")
- return response
- end
-
- # @return [Hash] lists
- def lists
- response = @access_token.get("http://api.twitter.com/1/#{@username}/lists.xml")
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- lists = Array.new
- doc.get_elements('/lists_list/lists/list').each{|element|
- list = List.new(element)
- lists << list
- }
- return lists
- end
-
-
- def lists_member_create(listid,id)
- begin
- response = @access_token.post("http://api.twitter.com/1/#{@username}/#{listid}/members.xml?id=#{id}")
- rescue
- return false
- else
- return response
- end
-
- end
-
- def lookup(param = [])
- param_s = param.join(",")
- begin
- response = @access_token.get("http://api.twitter.com/1/users/lookup.xml?user_id="+param_s)
- rescue
- return false
- end
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- users = Array.new
- doc.get_elements('/users/user').each{|element|
- user = User.new(element)
- users << user
- }
-
- return users
- end
-
- def friends_ids(name)
- begin
- response = @access_token.get("http://api.twitter.com/1/friends/ids/#{name}.xml")
- rescue
- return false
- end
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- ids = Array.new
-
- doc.get_elements('/ids/id').each{|element|
- ids << element.text()
- }
-
- return ids
- end
-
- def followers_ids(name)
- begin
- response = @access_token.get("http://api.twitter.com/1/followers/ids/#{name}.xml")
- rescue
- return false
- end
- doc = REXML::Document.new(response.body)
- if doc.is_error? then
- return doc.get_error_message
- end
- ids = Array.new
-
- doc.get_elements('/ids/id').each{|element|
- ids << element.text()
- }
-
- return ids
- end
-
- def rate_limit
- begin
- response = @access_token.get("http://api.twitter.com/1/account/rate_limit_status.xml")
- rescue
- return false
- end
- doc = REXML::Document.new(response.body)
- return false if doc.is_error?
- limit = doc.get_elements('/hash/hourly-limit').shift.text()
-
- return limit
- end
-
- def update(status,irt='')
- begin
- response = @access_token.post(
- 'http://api.twitter.com/1/statuses/update.json',
- 'status'=> status,
- 'in_reply_to_status_id' => irt
- )
- rescue
- return false
- end
- return response
- end
-
- def destroy(status_id)
- begin
- response = @access_token.post("http://api.twitter.com/1/statuses/destroy/#{status_id}.xml")
- rescue
- return false
- end
- return response
- end
-
- def update_location(location='')
- location = URI.escape(location)
- begin
- response = @access_token.post("http://api.twitter.com/1/account/update_location.xml?location=#{location}")
- rescue
- return false
- end
- return response
- end
-
- class List
- attr_reader :id
- attr_reader :name
- attr_reader :full_name
- attr_reader :slug
- attr_reader :description
- attr_reader :subscriber_count
- attr_reader :member_count
- attr_reader :uri
- attr_reader :following
- attr_reader :mode
- attr_reader :user
-
- def initialize(element)
- @id = element.elements['id'].text()
- @name = element.elements['name'].text()
- @full_name = element.elements['full_name'].text()
- @slug = element.elements['slug'].text()
- @description = element.elements['description'].text()
- @subscriber_count = element.elements['subscriber_count'].text()
- @member_count = element.elements['member_count'].text()
- @uri = element.elements['uri'].text()
- @following = element.elements['following'].text()
- @mode = element.elements['mode'].text()
- @user = User.new(element.elements['user'])
- end
- end
- class DirectMessage
- attr_reader :id
- attr_reader :sender_id
- attr_reader :text
- attr_reader :recipient_id
- attr_reader :created_at
- attr_reader :sender_screen_name
- attr_reader :recipient_screen_name
- attr_reader :sender
- attr_reader :recipient
-
- def initialize(element)
- @id = element.elements['id'].text()
- @sender_id = element.elements['sender_id'].text()
- @text = element.elements['text'].text()
- @recipient_id = element.elements['recipient_id'].text()
- @created_at = element.elements['created_at'].text()
- @sender_screen_name = element.elements['sender_screen_name'].text()
- @recipient_screen_name= element.elements['recipient_screen_name'].text()
- @sender = User.new(element.elements['sender'])
- @recipient = User.new(element.elements['recipient'])
- end
- end
- class User
- attr_reader :id
- attr_reader :name
- attr_reader :screen_name
- attr_reader :description
- attr_reader :url
- attr_reader :followers_count
- attr_reader :friends_count
- attr_reader :statuses_count
- attr_reader :location
- attr_reader :profile_image_url
- attr_reader :profile_background_color
- attr_reader :profile_background_image_url
- attr_reader :profile_background_tile
- attr_reader :profile_text_color
- attr_reader :profile_link_color
- attr_reader :profile_sidebar_fill_color
- attr_reader :profile_sidebar_border_color
- attr_reader :protected
- attr_reader :created_at
- attr_reader :favourites_count
- attr_reader :utc_offset
- attr_reader :time_zone
- attr_reader :notifications
- attr_reader :geo_enabled
- attr_reader :verified
- attr_reader :lang
- attr_reader :contributors_enabled
- attr_reader :following
- attr_reader :follow_request_sent
-
- def initialize(element)
- @id = element.elements['id'].text()
- @name = element.elements['name'].text()
- @screen_name = element.elements['screen_name'].text()
- @location = element.elements['location'].text()
- @description = element.elements['description'].text()
- @profile_image_url = element.elements['profile_image_url'].text()
- @url = element.elements['url'].text()
- @protected = element.elements['protected'].text()
- @followers_count = element.elements['followers_count'].text()
- @friends_count = element.elements['friends_count'].text()
- @profile_background_color = element.elements['profile_background_color'].text()
- @profile_background_image_url = element.elements['profile_background_image_url'].text()
- @profile_background_tile = element.elements['profile_background_tile'].text()
- @profile_text_color = element.elements['profile_text_color'].text()
- @profile_link_color = element.elements['profile_link_color'].text()
- @profile_sidebar_fill_color = element.elements['profile_sidebar_fill_color'].text()
- @profile_sidebar_border_color = element.elements['profile_sidebar_border_color'].text()
- @statuses_count = element.elements['statuses_count'].text()
- @created_at = element.elements['created_at'].text()
- @favourites_count = element.elements['favourites_count'].text()
- @utc_offset = element.elements['utc_offset'].text()
- @time_zone = element.elements['time_zone'].text()
- @notifications = element.elements['notifications'].text()
- @geo_enabled = element.elements['geo_enabled'].text()
- @verified = element.elements['verified'].text()
- @lang = element.elements['lang'].text()
- @contributors_enabled = element.elements['contributors_enabled'].text()
- @following = element.elements['following'].text()
- @follow_request_sent = element.elements['follow_request_sent'].text()
- end
- end
-
- class Status
- attr_reader :created_at
- attr_reader :id
- attr_reader :text
- attr_reader :source
- attr_reader :truncated
- attr_reader :in_reply_to_status_id
- attr_reader :in_reply_to_user_id
- attr_reader :in_reply_to_screen_name
- attr_reader :favorited
- attr_reader :user
- attr_reader :geo
- attr_reader :place
- attr_reader :coordinates
- attr_reader :contributors
- attr_reader :annotations
- attr_reader :entities
-
- def initialize(element)
- @created_at = element.elements['created_at'].text()
- @id = element.elements['id'].text()
- @text = element.elements['text'].text()
- @source = element.elements['source'].text()
- @truncated = element.elements['truncated'].text()
- @in_reply_to_status_id = element.elements['in_reply_to_status_id'].text()
- @in_reply_to_user_id = element.elements['in_reply_to_user_id'].text()
- @in_reply_to_screen_name = element.elements['in_reply_to_screen_name'].text()
- @favorited = element.elements['favorited'].text()
- @user = User.new(element.elements['user'])
- @geo = element.elements['geo'].text()
- @place = element.elements['place'].text()
- @coordinates = (element.elements['coordinates'].nil?) ? nil : element.elements['coordinates'].text()
- @contributors = (element.elements['contributors'].nil?) ? nil : element.elements['contributors'].text()
- @annotations = (element.elements['annotations'].nil?) ? nil : element.elements['annotations'].text()
- @entities = (element.elements['entities'].nil?) ? nil : Entities.new(element.elements['entities'])
- end
- end
-
- class Entities
- attr_reader :user_mentions
- attr_reader :urls
- attr_reader :hashtags
-
- def initialize(element)
- @user_mentions = UserMention.new(element.elements['user_mention'])
- @urls = URL.new(element.elements['urls'])
- @hashtags = Hashtag.new(element.elements['hashtags'])
- end
- end
-
- class UserMention
- attr_reader :id
- attr_reader :screen_name
- attr_reader :name
- attr_reader :start
- attr_reader :end
-
- def initialize(element)
- @id = element.elements['id'].text()
- @screen_name = element.elements['screen_name'].text()
- @name = element.elements['name'].text()
- @start = element.attributes['start']
- @end = element.attributes['end']
- end
- end
-
- class URL
- attr_reader :url
- attr_reader :expanded_url
- attr_reader :start
- attr_reader :end
-
- def initialize(element)
- @url = element.elements['url'].text()
- @expanded_url = element.elements['expanded_url'].text()
- @start = element.attributes['start']
- @end = element.attributes['end']
- end
- end
-
- class Hashtag
- attr_reader :text
- attr_reader :start
- attr_reader :end
-
- def initialize(element)
- @text = element.elements['text'].text()
- @start = element.attributes['start']
- @end = element.attributes['end']
- end
- end
-end
+$LOAD_PATH << File.dirname(File.expand_path(__FILE__)) if RUBY_VERSION >= "1.9.0"
+require "pupil/base"
+require "pupil/schemes"
+require "pupil/account"
+require "pupil/statuses"
+require "pupil/users"
+require "pupil/direct_messages"
+require "pupil/lists"
+require "pupil/friendships"
+require "pupil/blocks"
+require "pupil/stream"
\ No newline at end of file