pupil 0.0.6 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Gemfile.lock +5 -3
- data/VERSION +1 -1
- data/lib/pupil.rb +18 -660
- data/lib/pupil/account.rb +51 -0
- data/lib/pupil/base.rb +83 -0
- data/lib/pupil/blocks.rb +45 -0
- data/lib/pupil/direct_messages.rb +57 -0
- data/lib/pupil/friendships.rb +70 -0
- data/lib/pupil/{keygen.rb → keygen/keygen.rb} +0 -0
- data/lib/pupil/lists.rb +34 -0
- data/lib/pupil/schemes.rb +220 -0
- data/lib/pupil/statuses.rb +84 -0
- data/lib/pupil/stream.rb +94 -0
- data/lib/pupil/users.rb +13 -0
- data/pupil.gemspec +16 -4
- data/samples/generate-key.rb +1 -2
- data/spec/pupil_spec.rb +123 -2
- metadata +37 -17
- data/samples/ff-dumper.rb +0 -19
@@ -0,0 +1,51 @@
|
|
1
|
+
class Pupil
|
2
|
+
# Verify credentials
|
3
|
+
# @return [Pupil::User] User credentials
|
4
|
+
def verify_credentials
|
5
|
+
response = self.get("/account/verify_credentials.json")
|
6
|
+
user = User.new response
|
7
|
+
return user
|
8
|
+
end
|
9
|
+
|
10
|
+
# Rate limit statuses
|
11
|
+
# @return [Hash] Rate limit statuses
|
12
|
+
def rate_limit
|
13
|
+
response = self.get("/account/rate_limit_status.json")
|
14
|
+
return response
|
15
|
+
end
|
16
|
+
|
17
|
+
# End oauth session
|
18
|
+
# @return [Hash] Result
|
19
|
+
def end_session
|
20
|
+
response = self.post("/account/end_session.json")
|
21
|
+
return response
|
22
|
+
end
|
23
|
+
|
24
|
+
# Update profile
|
25
|
+
# @return [Pupil::User] Updated profile
|
26
|
+
# @param [Hash] param
|
27
|
+
# @option param [String] :name
|
28
|
+
# @option param [String] :url
|
29
|
+
# @option param [String] :location
|
30
|
+
# @option param [String] :description
|
31
|
+
# @option param [String] :colors #=> :background
|
32
|
+
# @option param [String] :colors #=> :link
|
33
|
+
# @option param [String] :colors #=> :sidebar_border
|
34
|
+
# @option param [String] :colors #=> :sidebar_fill
|
35
|
+
# @option param [String] :colors #=> :text
|
36
|
+
def update_profile param
|
37
|
+
if param.key? :colors
|
38
|
+
opt = Hash.new
|
39
|
+
opt.update({:profile_background_color => param[:colors][:background]}) if param[:colors][:background]
|
40
|
+
opt.update({:profile_link_color => param[:colors][:link]}) if param[:colors][:link]
|
41
|
+
opt.update({:profile_sidebar_border => param[:colors][:sidebar_border]}) if param[:colors][:sidebar_border]
|
42
|
+
opt.update({:profile_sidebar_fill => param[:colors][:sidebar_fill]}) if param[:colors][:sidebar_fill]
|
43
|
+
oot.update({:profile_text_color => param[:colors][:text]}) if param[:colors][:text]
|
44
|
+
param.delete :colors
|
45
|
+
response = self.post("/account/update_profile_colors.json", opt)
|
46
|
+
return User.new response if param.size <= 0
|
47
|
+
end
|
48
|
+
response2 = self.post("/account/update_profile.json", param)
|
49
|
+
return User.new response2
|
50
|
+
end
|
51
|
+
end
|
data/lib/pupil/base.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
class Pupil
|
2
|
+
attr_reader :screen_name
|
3
|
+
class UnsupportedParameter < StandardError ; end
|
4
|
+
class NetworkError < StandardError ; end
|
5
|
+
|
6
|
+
TWITTER_API_URL = "http://api.twitter.com"
|
7
|
+
|
8
|
+
# @param [Hash] pupil_key
|
9
|
+
def initialize key
|
10
|
+
@screen_name = key[:screen_name]
|
11
|
+
@client = nil
|
12
|
+
@config = nil
|
13
|
+
|
14
|
+
@consumer = OAuth::Consumer.new(
|
15
|
+
key[:consumer_key],
|
16
|
+
key[:consumer_secret],
|
17
|
+
:site => TWITTER_API_URL
|
18
|
+
)
|
19
|
+
@access_token = OAuth::AccessToken.new(
|
20
|
+
@consumer,
|
21
|
+
key[:access_token],
|
22
|
+
key[:access_token_secret]
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
# @param [Hash] parameter
|
27
|
+
# @return [String] URL Serialized parameters
|
28
|
+
def self.param_serializer parameter
|
29
|
+
return "" unless parameter.class == Hash
|
30
|
+
ant = Hash.new
|
31
|
+
parameter.each do |key, value|
|
32
|
+
case key.to_sym
|
33
|
+
when :include
|
34
|
+
if value.class == String || Symbol
|
35
|
+
ant[:"include_#{value}"] = :true
|
36
|
+
break
|
37
|
+
end
|
38
|
+
|
39
|
+
value.each do |element|
|
40
|
+
raise UnsupportedParameter, "include_entities is not supported." if element.to_sym == :entities
|
41
|
+
ant[:"include_#{element}"] = :true
|
42
|
+
end
|
43
|
+
when :exclude
|
44
|
+
if value.class == String || Symbol
|
45
|
+
ant[:"exclude_#{value}"] = :true
|
46
|
+
break
|
47
|
+
end
|
48
|
+
|
49
|
+
value.each do |element|
|
50
|
+
ant[:"exclude_#{element}"] = :true
|
51
|
+
end
|
52
|
+
else
|
53
|
+
ant[key.to_sym] = value.to_s
|
54
|
+
end
|
55
|
+
end
|
56
|
+
param = ant.inject(""){|k,v|k+"&#{v[0]}=#{URI.escape(v[1])}"}.sub!(/^&/,"?")
|
57
|
+
return param ? param : ""
|
58
|
+
end
|
59
|
+
|
60
|
+
def param_serializer parameter
|
61
|
+
Pupil.param_serializer parameter
|
62
|
+
end
|
63
|
+
|
64
|
+
def get url, param={}
|
65
|
+
param_s = param_serializer(param)
|
66
|
+
begin
|
67
|
+
response = @access_token.get(url+param_s).body
|
68
|
+
rescue => vars
|
69
|
+
raise NetworkError, vars
|
70
|
+
end
|
71
|
+
return JSON.parse(response)
|
72
|
+
end
|
73
|
+
|
74
|
+
def post url, param={}
|
75
|
+
param_s = param_serializer(param)
|
76
|
+
begin
|
77
|
+
response = @access_token.post(url+param_s).body
|
78
|
+
rescue => vars
|
79
|
+
raise NetworkError, vars
|
80
|
+
end
|
81
|
+
return JSON.parse(response)
|
82
|
+
end
|
83
|
+
end
|
data/lib/pupil/blocks.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
class Pupil
|
2
|
+
# @param [Fixnum] id id
|
3
|
+
# @return [Hash] response
|
4
|
+
def block param
|
5
|
+
case param.keys[0].to_sym
|
6
|
+
when :screen_name
|
7
|
+
response = self.post("/blocks/create.json", {:screen_name => param.values[0]})
|
8
|
+
when :id
|
9
|
+
response = self.post("/blocks/create.json", {:user_id => param.values[0]})
|
10
|
+
end
|
11
|
+
|
12
|
+
if response.class == Hash && response["id"]
|
13
|
+
return User.new response
|
14
|
+
end
|
15
|
+
return false
|
16
|
+
end
|
17
|
+
|
18
|
+
# @param [Fixnum] id id
|
19
|
+
# @return [Hash] response
|
20
|
+
def unblock param
|
21
|
+
case param.keys[0].to_sym
|
22
|
+
when :screen_name
|
23
|
+
response = self.post("/blocks/destroy.json", {:screen_name => param.values[0]})
|
24
|
+
when :id
|
25
|
+
response = self.post("/blocks/destroy.json", {:user_id => param.values[0]})
|
26
|
+
end
|
27
|
+
|
28
|
+
if response.class == Hash && response["id"]
|
29
|
+
return User.new response
|
30
|
+
end
|
31
|
+
return false
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [Hash] list of blocking users
|
35
|
+
def blocking
|
36
|
+
response = self.get("/blocks/blocking.json")
|
37
|
+
p response
|
38
|
+
users = Array.new
|
39
|
+
response["users"].each do |element|
|
40
|
+
user = User.new element
|
41
|
+
users << user
|
42
|
+
end
|
43
|
+
return users
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
class Pupil
|
2
|
+
# Returning direct messages
|
3
|
+
# @param [Hash] param
|
4
|
+
# @return [Hash] directmessages
|
5
|
+
def dm(param = {})
|
6
|
+
param_s = param_serializer(param)
|
7
|
+
begin
|
8
|
+
response = @access_token.get("http://api.twitter.com/1/direct_messages.xml"+param_s)
|
9
|
+
rescue
|
10
|
+
return false
|
11
|
+
end
|
12
|
+
doc = REXML::Document.new(response.body)
|
13
|
+
return false if doc.is_error?
|
14
|
+
directmessages = Array.new
|
15
|
+
|
16
|
+
doc.get_elements('/direct-messages/direct_message').each{|element|
|
17
|
+
dm = DirectMessage.new(element)
|
18
|
+
directmessages << dm
|
19
|
+
}
|
20
|
+
|
21
|
+
return directmessages
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returning direct messages you sent
|
25
|
+
# @param [Hash] param
|
26
|
+
# @return [Hash] directmessage you sent
|
27
|
+
def dm_sent(param = {})
|
28
|
+
param_s = param_serializer(param)
|
29
|
+
begin
|
30
|
+
response = @access_token.get("http://api.twitter.com/1/direct_messages/sent.xml"+param_s)
|
31
|
+
rescue
|
32
|
+
return false
|
33
|
+
end
|
34
|
+
doc = REXML::Document.new(response.body)
|
35
|
+
return false if doc.is_error?
|
36
|
+
directmessages = Array.new
|
37
|
+
|
38
|
+
doc.get_elements('/direct-messages/direct_message').each{|element|
|
39
|
+
dm = DirectMessage.new(element)
|
40
|
+
directmessages << dm
|
41
|
+
}
|
42
|
+
|
43
|
+
return directmessages
|
44
|
+
end
|
45
|
+
|
46
|
+
# Delete direct message
|
47
|
+
# @param [Fixnum] dm_id message id that you want to delete
|
48
|
+
# @return [Hash] response
|
49
|
+
def dm_destroy(dm_id)
|
50
|
+
begin
|
51
|
+
response = @access_token.post("http://api.twitter.com/1/direct_messages/destroy/#{dm_id}.xml")
|
52
|
+
rescue
|
53
|
+
return false
|
54
|
+
end
|
55
|
+
return response
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
class Pupil
|
2
|
+
def friends_ids name
|
3
|
+
response = self.get("/friends/ids/#{name}.json")
|
4
|
+
ids = Array.new
|
5
|
+
response.each do |element|
|
6
|
+
ids << element
|
7
|
+
end
|
8
|
+
return ids
|
9
|
+
end
|
10
|
+
|
11
|
+
def followers_ids name=@screen_name
|
12
|
+
response = self.get("/1/followers/ids/#{name}.json")
|
13
|
+
ids = Array.new
|
14
|
+
response.each do |element|
|
15
|
+
ids << element
|
16
|
+
end
|
17
|
+
return ids
|
18
|
+
end
|
19
|
+
|
20
|
+
# Check friendships
|
21
|
+
# @param [String] src source screen_name
|
22
|
+
# @param [String] dst destination screen_name
|
23
|
+
# @return [Boolean] return true if paired users have friendship, or ruturn false
|
24
|
+
def friendship?(src, dst)
|
25
|
+
param = {:source_screen_name => src, :target_screen_name => dst}
|
26
|
+
response = self.get("/friendships/show.json", param)
|
27
|
+
if response["relationship"]["source"]["following"] == true && response["relationship"]["target"]["following"] == true then
|
28
|
+
return true
|
29
|
+
else
|
30
|
+
return false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
alias_method "relationship?", "friendship?"
|
35
|
+
alias_method "friendships_exists?", "friendship?"
|
36
|
+
|
37
|
+
# Follow user for screen_name
|
38
|
+
# @param [String] name screen_name
|
39
|
+
# @return [Hash] response
|
40
|
+
def follow param
|
41
|
+
case param.keys[0].to_sym
|
42
|
+
when :screen_name
|
43
|
+
response = self.post("/friendships/create.json", {:screen_name => param.values[0]})
|
44
|
+
when :id
|
45
|
+
response = self.post("/friendships/create.json", {:user_id => param.values[0]})
|
46
|
+
end
|
47
|
+
|
48
|
+
if response.class == Hash && response["id"]
|
49
|
+
return User.new response
|
50
|
+
end
|
51
|
+
return false
|
52
|
+
end
|
53
|
+
|
54
|
+
# Unfollow user for screen_name
|
55
|
+
# @param [String] name screen_name
|
56
|
+
# @return [Hash] response
|
57
|
+
def unfollow param
|
58
|
+
case param.keys[0].to_sym
|
59
|
+
when :screen_name
|
60
|
+
response = self.post("/friendships/destroy.json", {:screen_name => param.values[0]})
|
61
|
+
when :id
|
62
|
+
response = self.post("/friendships/destroy.json", {:user_id => param.values[0]})
|
63
|
+
end
|
64
|
+
|
65
|
+
if response.class == Hash && response["id"]
|
66
|
+
return User.new response
|
67
|
+
end
|
68
|
+
return false
|
69
|
+
end
|
70
|
+
end
|
File without changes
|
data/lib/pupil/lists.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
class Pupil
|
2
|
+
# @param [Fixnum] id list id
|
3
|
+
# @param [String] ids id comma separated
|
4
|
+
# @return [Hash] response
|
5
|
+
def addlist(listid,ids)
|
6
|
+
response = @access_token.post("http://api.twitter.com/1/#{@username}/#{listid}/create_all.xml?user_id=#{ids}")
|
7
|
+
return response
|
8
|
+
end
|
9
|
+
|
10
|
+
# @return [Hash] lists
|
11
|
+
def lists
|
12
|
+
response = @access_token.get("http://api.twitter.com/1/#{@username}/lists.xml")
|
13
|
+
doc = REXML::Document.new(response.body)
|
14
|
+
return false if doc.is_error?
|
15
|
+
lists = Array.new
|
16
|
+
doc.get_elements('/lists_list/lists/list').each{|element|
|
17
|
+
list = List.new(element)
|
18
|
+
lists << list
|
19
|
+
}
|
20
|
+
return lists
|
21
|
+
end
|
22
|
+
|
23
|
+
def lists_member_create(listid,id)
|
24
|
+
begin
|
25
|
+
response = @access_token.post("http://api.twitter.com/1/#{@username}/#{listid}/members.xml?id=#{id}")
|
26
|
+
rescue
|
27
|
+
return false
|
28
|
+
else
|
29
|
+
return response
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,220 @@
|
|
1
|
+
class Pupil
|
2
|
+
class User
|
3
|
+
attr_reader :contributors_enabled
|
4
|
+
attr_reader :created_at
|
5
|
+
attr_reader :default_profile
|
6
|
+
attr_reader :default_profile_image
|
7
|
+
attr_reader :description
|
8
|
+
attr_reader :favourites_count
|
9
|
+
attr_reader :follow_request_sent
|
10
|
+
attr_reader :followers_count
|
11
|
+
attr_reader :following
|
12
|
+
attr_reader :friends_count
|
13
|
+
attr_reader :geo_enabled
|
14
|
+
attr_reader :id
|
15
|
+
attr_reader :id_str
|
16
|
+
attr_reader :is_translator
|
17
|
+
attr_reader :lang
|
18
|
+
attr_reader :listed_count
|
19
|
+
attr_reader :location
|
20
|
+
attr_reader :name
|
21
|
+
attr_reader :notifications
|
22
|
+
attr_reader :profile_background_color
|
23
|
+
attr_reader :profile_background_image_url
|
24
|
+
attr_reader :profile_background_image_url_https
|
25
|
+
attr_reader :profile_background_tile
|
26
|
+
attr_reader :profile_image_url
|
27
|
+
attr_reader :profile_image_url_https
|
28
|
+
attr_reader :profile_link_color
|
29
|
+
attr_reader :profile_sidebar_border_color
|
30
|
+
attr_reader :profile_sidebar_fill_color
|
31
|
+
attr_reader :profile_text_color
|
32
|
+
attr_reader :profile_use_background_image
|
33
|
+
attr_reader :protected
|
34
|
+
attr_reader :screen_name
|
35
|
+
attr_reader :show_all_inline_media
|
36
|
+
attr_reader :status
|
37
|
+
attr_reader :statuses_count
|
38
|
+
attr_reader :time_zone
|
39
|
+
attr_reader :url
|
40
|
+
attr_reader :utc_offset
|
41
|
+
attr_reader :verified
|
42
|
+
|
43
|
+
def initialize j
|
44
|
+
@contributors_enabled = j["contributors_enabled"] rescue nil
|
45
|
+
@created_at = j["created_at"]
|
46
|
+
@default_profile = j["default_profile"]
|
47
|
+
@default_profile_image = j["default_profile_image"]
|
48
|
+
@description = j["description"]
|
49
|
+
@favourites_count = j["favourites_count"]
|
50
|
+
@follow_request_sent = j["follow_request_sent"]
|
51
|
+
@followers_count = j["followers_count"]
|
52
|
+
@following = j["following"]
|
53
|
+
@friends_count = j["friends_count"]
|
54
|
+
@geo_enabled = j["geo_enabled"]
|
55
|
+
@id = j["id"]
|
56
|
+
@id_str = j["id_str"]
|
57
|
+
@is_translator = j["is_translator"]
|
58
|
+
@lang = j["lang"]
|
59
|
+
@listed_count = j["listed_count"]
|
60
|
+
@location = j["location"]
|
61
|
+
@name = j["name"]
|
62
|
+
@notifications = j["notifications"]
|
63
|
+
@profile_background_color = j["profile_background_color"]
|
64
|
+
@profile_background_image_url = j["profile_background_image_url"]
|
65
|
+
@profile_background_image_url_https = j["profile_background_image_url_https"]
|
66
|
+
@profile_background_tile = j["profile_background_tile"]
|
67
|
+
@profile_image_url = j["profile_image_url"]
|
68
|
+
@profile_image_url_https = j["profile_image_url_https"]
|
69
|
+
@profile_link_color = j["profile_link_color"]
|
70
|
+
@profile_sidebar_border_color = j["profile_sidebar_border_color"]
|
71
|
+
@profile_sidebar_fill_color = j["profile_sidebar_fill_color"]
|
72
|
+
@profile_text_color = j["profile_text_color"]
|
73
|
+
@profile_use_background_image = j["profile_use_background_image"]
|
74
|
+
@protected = j["protected"]
|
75
|
+
@screen_name = j["screen_name"]
|
76
|
+
@show_all_inline_media = j["show_all_inline_media"]
|
77
|
+
@status = Status.new j["status"]
|
78
|
+
@statuses_count = j["statuses_count"]
|
79
|
+
@time_zone = j["time_zone"]
|
80
|
+
@url = j["url"]
|
81
|
+
@utc_offset = j["utc_offset"]
|
82
|
+
@verified = j["verified"]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
class URL
|
87
|
+
attr_reader :url
|
88
|
+
attr_reader :expanded_url
|
89
|
+
attr_reader :start
|
90
|
+
attr_reader :end
|
91
|
+
|
92
|
+
def initialize(element)
|
93
|
+
@url = element.elements['url'].text()
|
94
|
+
@expanded_url = element.elements['expanded_url'].text()
|
95
|
+
@start = element.attributes['start']
|
96
|
+
@end = element.attributes['end']
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
class Status
|
101
|
+
attr_reader :contributors
|
102
|
+
attr_reader :coordinates
|
103
|
+
attr_reader :created_at
|
104
|
+
attr_reader :favorited
|
105
|
+
attr_reader :geo
|
106
|
+
attr_reader :id
|
107
|
+
attr_reader :id_str
|
108
|
+
attr_reader :in_reply_to_screen_name
|
109
|
+
attr_reader :in_reply_to_status_id
|
110
|
+
attr_reader :in_reply_to_status_id_str
|
111
|
+
attr_reader :in_reply_to_user_id
|
112
|
+
attr_reader :in_reply_to_user_id_str
|
113
|
+
attr_reader :place
|
114
|
+
attr_reader :retweet_count
|
115
|
+
attr_reader :retweeted
|
116
|
+
attr_reader :source
|
117
|
+
attr_reader :text
|
118
|
+
attr_reader :truncated
|
119
|
+
attr_reader :user
|
120
|
+
|
121
|
+
def initialize j
|
122
|
+
@contributors = j["contributors"]
|
123
|
+
@coordinates = j["coordinates"]
|
124
|
+
@created_at = j["created_at"]
|
125
|
+
@favorited = j["favorited"]
|
126
|
+
@geo = j["geo"]
|
127
|
+
@id = j["id"]
|
128
|
+
@id_str = j["id_str"]
|
129
|
+
@in_reply_to_screen_name = j["in_reply_to_screen_name"]
|
130
|
+
@in_reply_to_status_id = j["in_reply_to_status_id"]
|
131
|
+
@in_reply_to_status_id_str = j["in_reply_to_status_id_str"]
|
132
|
+
@in_reply_to_user_id = j["in_reply_to_user_id"]
|
133
|
+
@in_reply_to_user_id_str = j["in_reply_to_user_id_str"]
|
134
|
+
@place = j["place"]
|
135
|
+
@retweet_count = j["retweet_count"]
|
136
|
+
@retweeted = j["retweeted"]
|
137
|
+
j["source"] =~ /href=\"(.+?)\".+?>(.+?)</
|
138
|
+
@source = {:url => $1, :name => $2}
|
139
|
+
@text = j["text"]
|
140
|
+
@truncated = j["truncated"]
|
141
|
+
@user = User.new j["user"] rescue nil
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
class List
|
146
|
+
attr_reader :id
|
147
|
+
attr_reader :name
|
148
|
+
attr_reader :full_name
|
149
|
+
attr_reader :slug
|
150
|
+
attr_reader :description
|
151
|
+
attr_reader :subscriber_count
|
152
|
+
attr_reader :member_count
|
153
|
+
attr_reader :uri
|
154
|
+
attr_reader :following
|
155
|
+
attr_reader :mode
|
156
|
+
attr_reader :user
|
157
|
+
|
158
|
+
def initialize(element)
|
159
|
+
@id = element.elements['id'].text()
|
160
|
+
@name = element.elements['name'].text()
|
161
|
+
@full_name = element.elements['full_name'].text()
|
162
|
+
@slug = element.elements['slug'].text()
|
163
|
+
@description = element.elements['description'].text()
|
164
|
+
@subscriber_count = element.elements['subscriber_count'].text()
|
165
|
+
@member_count = element.elements['member_count'].text()
|
166
|
+
@uri = element.elements['uri'].text()
|
167
|
+
@following = element.elements['following'].text()
|
168
|
+
@mode = element.elements['mode'].text()
|
169
|
+
@user = User.new(element.elements['user'])
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
class Entities
|
174
|
+
attr_reader :user_mentions
|
175
|
+
attr_reader :urls
|
176
|
+
attr_reader :hashtags
|
177
|
+
|
178
|
+
def initialize(element)
|
179
|
+
@user_mentions = UserMention.new(element.elements['user_mention'])
|
180
|
+
@urls = URL.new(element.elements['urls'])
|
181
|
+
@hashtags = Hashtag.new(element.elements['hashtags'])
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
class Hashtag
|
186
|
+
attr_reader :text
|
187
|
+
attr_reader :start
|
188
|
+
attr_reader :end
|
189
|
+
|
190
|
+
def initialize(element)
|
191
|
+
@text = element.elements['text'].text()
|
192
|
+
@start = element.attributes['start']
|
193
|
+
@end = element.attributes['end']
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
class DirectMessage
|
198
|
+
attr_reader :id
|
199
|
+
attr_reader :sender_id
|
200
|
+
attr_reader :text
|
201
|
+
attr_reader :recipient_id
|
202
|
+
attr_reader :created_at
|
203
|
+
attr_reader :sender_screen_name
|
204
|
+
attr_reader :recipient_screen_name
|
205
|
+
attr_reader :sender
|
206
|
+
attr_reader :recipient
|
207
|
+
|
208
|
+
def initialize(element)
|
209
|
+
@id = element.elements['id'].text()
|
210
|
+
@sender_id = element.elements['sender_id'].text()
|
211
|
+
@text = element.elements['text'].text()
|
212
|
+
@recipient_id = element.elements['recipient_id'].text()
|
213
|
+
@created_at = element.elements['created_at'].text()
|
214
|
+
@sender_screen_name = element.elements['sender_screen_name'].text()
|
215
|
+
@recipient_screen_name= element.elements['recipient_screen_name'].text()
|
216
|
+
@sender = User.new(element.elements['sender'])
|
217
|
+
@recipient = User.new(element.elements['recipient'])
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|