lib/onebox/engine/twitter_status_onebox.rb in onebox-1.4.7 vs lib/onebox/engine/twitter_status_onebox.rb in onebox-1.4.8
- old
+ new
@@ -1,24 +1,97 @@
module Onebox
module Engine
class TwitterStatusOnebox
include Engine
- include JSON
+ include LayoutSupport
+ include HTML
matches_regexp Regexp.new("^http(?:s)?://(?:www\\.)?(?:(?:\\w)+\\.)?(twitter)\\.com(?:/)?(?:.)*/status(es)?/")
- def url
- "https://api.twitter.com/1/statuses/oembed.json?id=#{match[:id]}"
+ private
+
+ def match
+ @match ||= @url.match(%r{twitter\.com/.+?/status(es)?/(?<id>\d+)})
end
- def to_html
- raw['html']
+ def client
+ Onebox.options.twitter_client
end
- private
+ def raw
+ if client
+ @raw ||= OpenStruct.new(client.status(match[:id]).to_hash)
+ else
+ super
+ end
+ end
- def match
- @match ||= @url.match(%r{twitter\.com/.+?/status(es)?/(?<id>\d+)})
+ def access(*keys)
+ keys.reduce(raw) do |memo, key|
+ memo[key] || memo[key.to_s]
+ end
+ end
+
+ def tweet
+ if raw.html?
+ raw.css(".tweet-text")[0].inner_text
+ else
+ access(:text)
+ end
+ end
+
+ def timestamp
+ if raw.html?
+ raw.css(".metadata span")[0].inner_text
+ else
+ created_at = access(:created_at)
+ date = DateTime.strptime(created_at, "%a %b %d %H:%M:%S %z %Y")
+ user_offset = access(:user, :utc_offset).to_i
+ offset = (user_offset >= 0 ? "+" : "-") + Time.at(user_offset.abs).gmtime.strftime("%H%M")
+ date.new_offset(offset).strftime("%l:%M %p - %e %b %Y")
+ end
+ end
+
+ def title
+ if raw.html?
+ raw.css(".stream-item-header .username").inner_text
+ else
+ access(:user, :screen_name)
+ end
+ end
+
+ def avatar
+ if raw.html?
+ raw.css(".avatar")[2]["src"]
+ else
+ access(:user, :profile_image_url)
+ end
+ end
+
+ def favorites
+ if raw.html?
+ raw.css(".stats li .request-favorited-popup").inner_text
+ else
+ access(:favorite_count)
+ end
+ end
+
+ def retweets
+ if raw.html?
+ raw.css(".stats li .request-retweeted-popup").inner_text
+ else
+ access(:retweet_count)
+ end
+ end
+
+ def data
+ { link: link,
+ tweet: tweet,
+ timestamp: timestamp,
+ title: title,
+ avatar: avatar,
+ favorites: favorites,
+ retweets: retweets }
end
end
end
end