#!/usr/bin/env ruby def red_text(text) "\e[31m#{text}\e[39;49m" end def green_text(text) "\e[32m#{text}\e[39;49m" end def shorten(url) require 'net/http' require 'open-uri' require 'cgi' log = Logger.new(STDERR) parsed_url = "http://www.tinyurl.com/api-create.php?url=#{url}" resp = open(parsed_url).read log.info("In shorten: #{resp}") return resp end def update url="http://#{ARGV.shift}:#{ARGV.shift}@twitter.com/statuses/update.xml" require 'open-uri' require 'net/http' require 'uri' new_arg = '' uri = '' require 'logger' log=Logger.new(STDERR) ARGV.each { |arg| if(arg.match(/^http/) != nil) then uri = shorten(arg) arg = uri end } log.level=Logger::FATAL tweet = ARGV.join(' ') tweet.gsub!(/http[^ ]+/,uri) log.info(tweet) res = Net::HTTP.post_form(URI.parse(url), {'status' => "#{tweet}", 'X-Twitter-Client' => 'twitterupdate.rb', 'source' => 'twitterupdate' }) if(res.code.to_s.match(/^2/) == nil) then $stderr.puts("Error updating tweet -- #{res.body}\n#{res.code}") end end def view_public url = "http://twitter.com/statuses/public_timeline.rss" require 'open-uri' require 'rexml/document' content = open(url).read doc=REXML::Document.new(content) doc.elements.each('//item') do |thing| puts "#{green_text(thing.elements['pubDate'].text)}: #{thing.elements['title'].text}" end end def view_friends require 'uri' require 'rexml/document' require 'net/http' url="http://twitter.com/statuses/replies.rss" url2='http://twitter.com/direct_messages.rss' parsed_url = URI.parse(url) parsed_direct = URI.parse(url2) http = Net::HTTP.new(parsed_url.host) content = '' user = ARGV.shift pass = ARGV.shift http.start do http req = Net::HTTP::Get.new(parsed_url.path) req.basic_auth user, pass resp = http.request(req) content = resp.body end http2 = Net::HTTP.new(parsed_direct.host) content2 = '' http2.start do http req = Net::HTTP::Get.new(parsed_direct.path) req.basic_auth user, pass resp = http.request(req) content2 = resp.body end doc = nil doc = REXML::Document.new(content2) dms = Array.new doc.elements.each('//item') do |thing| dms << "#{red_text(thing.elements['pubDate'].text)} (#{thing.elements['title'].text}): #{thing.elements['description'].text}" end dms.reverse! replies = Array.new doc= REXML::Document.new(content) doc.elements.each('//item') do |thing| replies << "#{green_text(thing.elements['pubDate'].text)}: #{thing.elements['title'].text}" end replies.reverse! dms.each { |d| puts d } replies.each { |r| puts r } end Infinity = 1.0/0 case ARGV.length when 2 view_friends when 0, nil view_public when 2..Infinity update when 1 puts "invalid number of arguments\nUsage: twitterupdate.rb [user] [password] [new status]\n valid ones are:\n0 view public timeline\n2 view replies to your username\n3 or more send your twitter to the world, put your username and password in the first two args" exit end puts red_text('--------------------------------------------------------------------------------')