73eb9ae662
This drops storing twitter:last_story_id in Keystore and stores each story's tweet id, so we can query which stories meet the threshold and haven't been posted to twitter yet.
68 lines
1.5 KiB
Ruby
Executable file
68 lines
1.5 KiB
Ruby
Executable file
#!/usr/bin/env ruby
|
|
|
|
ENV["RAILS_ENV"] ||= "production"
|
|
|
|
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
|
require File.expand_path('../../config/boot', __FILE__)
|
|
require APP_PATH
|
|
Rails.application.require_environment!
|
|
|
|
MIN_STORY_SCORE = 2
|
|
|
|
Story.where("is_expired = ? AND #{Story.score_sql} > ? AND " <<
|
|
"twitter_id IS NULL AND created_at >= ?", false, MIN_STORY_SCORE,
|
|
Time.now - 1.days).order(:id).each_with_index do |s,x|
|
|
if s.tags.map(&:tag).include?("meta")
|
|
next
|
|
end
|
|
|
|
if x > 0
|
|
sleep 2
|
|
end
|
|
|
|
tags = ""
|
|
s.sorted_taggings.each do |tagging|
|
|
tags += ' #' + tagging.tag.tag
|
|
end
|
|
|
|
tco_status = "\n" +
|
|
(s.url.present?? ("X" * Twitter::TCO_LEN) + "\n" : "") +
|
|
("X" * Twitter::TCO_LEN) +
|
|
tags
|
|
|
|
status = "\n" +
|
|
(s.url.present?? s.url + "\n" : "") +
|
|
s.short_id_url +
|
|
tags
|
|
|
|
left_len = Twitter::MAX_TWEET_LEN - tco_status.length
|
|
|
|
title = s.title
|
|
if title.match(/^([dm] |@)/i)
|
|
# prevent these tweets from activating twitter shortcuts
|
|
# https://dev.twitter.com/docs/faq#tweeting
|
|
title = "- #{title}"
|
|
end
|
|
|
|
if title.bytesize > left_len
|
|
status = title[0, left_len - 3] + "..." + status
|
|
else
|
|
status = title + status
|
|
end
|
|
|
|
res = Twitter.oauth_request("/1.1/statuses/update.json", :post,
|
|
{ "status" => status })
|
|
|
|
begin
|
|
if res["id_str"].match(/\d+/)
|
|
s.update_column("twitter_id", res["id_str"])
|
|
else
|
|
raise
|
|
end
|
|
rescue => e
|
|
puts "failed posting story #{s.id} (#{status.inspect}): #{e.inspect}\n" +
|
|
"#{res.inspect}"
|
|
exit
|
|
end
|
|
end
|