#!/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 = 3 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 via = "" if s.user.twitter_username.present? via = "\n" + (s.user_is_author? ? "by" : "via") + " @#{s.user.twitter_username}" end tco_status = via + "\n" + (s.url.present?? ("X" * Twitter::TCO_LEN) + "\n" : "") + ("X" * Twitter::TCO_LEN) + tags status = via + "\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 there are any urls in the title, they should be sized (at least) to a # twitter t.co url left_len -= (title.scan(/[^ ]\.[a-z]{2,10}/i).map{|u| [ 0, Twitter::TCO_LEN ].max }.inject(:+)).to_i if left_len < -3 left_len = -3 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"].to_s.match(/\d+/) s.update_column("twitter_id", res["id_str"]) elsif res["errors"].select{|e| e["code"] == 226 }.any? # twitter is rejecting the content of this message, skip it s.update_column("twitter_id", 0) puts "skipping: failed posting story #{s.id} (#{status.inspect}): " + "#{res.inspect}\n" else raise end rescue => e puts "failed posting story #{s.id} (#{status.inspect}): #{e.inspect}\n" + "#{res.inspect}" exit end end