#!/usr/bin/ruby
#
#  twitphone -- get twitters, mail 'em

require "net/http"
require "net/smtp"
require "rexml/document"

user = 'email@address.invalid'
pass = 'twitterpassword'

mailto = 'phone@address.invalid'
mailfrom = 'a@b.c'   # short = more characters for message

last = '/home/lafferty/.twitphone'
switch = '/home/lafferty/.twitphone-switch'

# list of users to follow -- ignores twitter's own follow setting
users = ['nyxie','coffeechica','substitute']

# get auth xml -- unauth xml is delayed significantly
res = Net::HTTP.start('twitter.com') { |http|
    req = Net::HTTP::Get.new('/statuses/friends_timeline.xml')
    req.basic_auth user, pass
    http.request(req)
}

f = File.open(last)
top_id = f.readline
f.close

# need this regardless of switch position, because we always
# update top_id. otherwise we get the whole night's twitters
# first thing in the AM.
doc = REXML::Document.new res.body

# if we're up and running...
f = File.open(switch)
switchpos = f.readline
f.close

if (switchpos.chomp == "on")
    # check each status to see if we need to send it
    sms = []
    
    doc.each_element("statuses/status") { |status|
    
       sender = status.elements["user/screen_name"].text
       body   = status.elements["text"].text
       source = status.elements["source"].text
       id     = status.elements["id"].text
    
       if (users.include?(sender) and id > top_id)
           body.gsub!(/<.*?>/, "");
           source.gsub!(/<.*?>/, "");
           
           sms << "f:" + sender + ":" + body + "/" + source
       end
    }
    
    
    # and again for replies
    
    rres = Net::HTTP.start('twitter.com') { |http|
        req = Net::HTTP::Get.new('/statuses/replies.xml')
        req.basic_auth user, pass
        http.request(req)
    }
    
    rdoc = REXML::Document.new rres.body
    
    rdoc.each_element("statuses/status") { |status|
        
       sender = status.elements["user/screen_name"].text
       body   = status.elements["text"].text
       source = status.elements["source"].text
       id     = status.elements["id"].text
    
       if (id > top_id)
           body.gsub!(/<.*?>/, "");
           source.gsub!(/<.*?>/, "");
           
           sms << "r:" + sender + ":" + body + "/" + source
       end
    }
    
    
    if (!sms.empty?)
        smtp = Net::SMTP.new("localhost")
        smtp.start
        sms.each { |sms| 
            msg = "\n" + sms
            puts smtp.send_message(msg, mailfrom, mailto)
        }
    end
end 

top_id = doc.elements["statuses/status/id"].text

f = File.open(last, "w")
f.print top_id
f.close
