class Onebox::Engine::TwitterStatusOnebox

Public Instance Methods

http_params() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 13
def http_params
  { 'User-Agent' => 'DiscourseBot/1.0' }
end

Private Instance Methods

access(*keys) click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 57
def access(*keys)
  keys.reduce(raw) do |memo, key|
    next unless memo
    memo[key] || memo[key.to_s]
  end
end
attr_at_css(css_property, attribute_name) click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 151
def attr_at_css(css_property, attribute_name)
  raw.at_css(css_property)&.attr(attribute_name)
end
avatar() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 91
def avatar
  if twitter_api_credentials_present?
    access(:user, :profile_image_url_https).sub('normal', '400x400')
  elsif twitter_data[:image]
    twitter_data[:image]
  end
end
client() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 41
def client
  Onebox.options.twitter_client
end
data() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 155
def data
  @data ||= {
    link: link,
    tweet: tweet,
    timestamp: timestamp,
    title: title,
    avatar: avatar,
    likes: likes,
    retweets: retweets,
    quoted_tweet: quoted_tweet,
    quoted_full_name: quoted_full_name,
    quoted_screen_name: quoted_screen_name,
    quoted_link: quoted_link
  }
end
get_twitter_data() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 19
def get_twitter_data
  response = Onebox::Helpers.fetch_response(url, headers: http_params) rescue nil
  html = Nokogiri::HTML(response)
  twitter_data = {}
  html.css('meta').each do |m|
    if m.attribute('property') && m.attribute('property').to_s.match(/^og:/i)
      m_content = m.attribute('content').to_s.strip
      m_property = m.attribute('property').to_s.gsub('og:', '')
      twitter_data[m_property.to_sym] = m_content
    end
  end
  twitter_data
end
likes() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 99
def likes
  if twitter_api_credentials_present?
    prettify_number(access(:favorite_count).to_i)
  else
    attr_at_css(".request-favorited-popup", 'data-compact-localized-count')
  end
end
match() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 33
def match
  @match ||= @url.match(%r{twitter\.com/.+?/status(es)?/(?<id>\d+)})
end
prettify_number(count) click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 147
def prettify_number(count)
  count > 0 ? client.prettify_number(count) : nil
end
quoted_full_name() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 115
def quoted_full_name
  if twitter_api_credentials_present?
    access(:quoted_status, :user, :name)
  else
    raw.css('.QuoteTweet-fullname')[0]&.text
  end
end
quoted_screen_name() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 123
def quoted_screen_name
  if twitter_api_credentials_present?
    access(:quoted_status, :user, :screen_name)
  else
    attr_at_css(".QuoteTweet-innerContainer", "data-screen-name")
  end
end
quoted_tweet() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 131
def quoted_tweet
  if twitter_api_credentials_present?
    access(:quoted_status, :full_text)
  else
    raw.css('.QuoteTweet-text')[0]&.text
  end
end
raw() click to toggle source
Calls superclass method Onebox::Engine::HTML#raw
# File lib/onebox/engine/twitter_status_onebox.rb, line 49
def raw
  if twitter_api_credentials_present?
    @raw ||= OpenStruct.new(client.status(match[:id]).to_hash)
  else
    super
  end
end
retweets() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 107
def retweets
  if twitter_api_credentials_present?
    prettify_number(access(:retweet_count).to_i)
  else
    attr_at_css(".request-retweeted-popup", 'data-compact-localized-count')
  end
end
timestamp() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 72
def timestamp
  if twitter_api_credentials_present?
    date = DateTime.strptime(access(: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 - %-d %b %Y")
  else
    attr_at_css(".tweet-timestamp", 'title')
  end
end
title() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 83
def title
  if twitter_api_credentials_present?
    "#{access(:user, :name)} (#{access(:user, :screen_name)})"
  else
    "#{attr_at_css('.tweet.permalink-tweet', 'data-name')} (#{attr_at_css('.tweet.permalink-tweet', 'data-screen-name')})"
  end
end
tweet() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 64
def tweet
  if twitter_api_credentials_present?
    client.prettify_tweet(raw)&.strip
  else
    twitter_data[:description].gsub(/“(.+?)”/im) { $1 } if twitter_data[:description]
  end
end
twitter_api_credentials_present?() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 45
def twitter_api_credentials_present?
  client && !client.twitter_credentials_missing?
end
twitter_data() click to toggle source
# File lib/onebox/engine/twitter_status_onebox.rb, line 37
def twitter_data
  @twitter_data ||= get_twitter_data
end