summaryrefslogtreecommitdiff
path: root/data/rbot/plugins/twitter.rb
blob: d1c6bd69dba3211ecb95a6ff88bd09b04dfec031 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#-- vim:sw=2:et
#++
#
# :title: Twitter Status Update for rbot
#
# Author:: Carter Parks (carterparks) <carter@carterparks.com>
# Author:: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
#
# Copyright:: (C) 2007 Carter Parks
#
# Users can setup their twitter username and password and then begin updating
# twitter whenever

require 'rexml/rexml'

class TwitterPlugin < Plugin
  def initialize
    super
    
    class << @registry
      def store(val)
        val
      end
      def restore(val)
        val
      end
    end
  end
  
  # return a help string when the bot is asked for help on this plugin
  def help(plugin, topic="")
    return "twitter status [status] => updates your status on twitter | twitter identify [username] [password] => ties your nick to your twitter username and password"
  end
  
  # update the status on twitter
  def get_status(m, params)
  
    nick = params[:nick] || @registry[m.sourcenick + "_username"]

    if not nick
      m.reply "you should specify the username of the twitter touse, or identify using 'twitter identify [username] [password]'"
      return false
    end
      
    # TODO configurable count
    uri = "http://twitter.com/statuses/user_timeline/#{URI.escape(nick)}.xml?count=3"
    
    response = @bot.httputil.get(uri, :cache => false)
    debug response

    texts = []
    
    if response
      begin
        rex = REXML::Document.new(response)
        rex.root.elements.each("status") { |st|
          month, day, hour, min, sec, year = st.elements['created_at'].text.match(/\w+ (\w+) (\d+) (\d+):(\d+):(\d+) \S+ (\d+)/)[1..6]
          debug [year, month, day, hour, min, sec].inspect
          time = Time.local(year.to_i, month, day.to_i, hour.to_i, min.to_i, sec.to_i)
          now = Time.now
          delta = now - time
          msg = st.elements['text'].to_s + " (#{Utils.secs_to_string(delta.to_i)} ago via #{st.elements['source'].to_s})"
          texts << Utils.decode_html_entities(msg).ircify_html
        }
      rescue
        error $!
        m.reply "could not parse status for #{nick}"
        return false
      end
      m.reply texts.reverse.join("\n")
      return true
    else
      m.reply "could not get status for #{nick}"
      return false
    end
  end
  
  # update the status on twitter
  def update_status(m, params)
  

    unless @registry.has_key?(m.sourcenick + "_password") && @registry.has_key?(m.sourcenick + "_username")
      m.reply "you must identify using 'twitter identify [username] [password]'"
      return false
    end
      
    uri = "http://#{URI.escape(@registry[m.sourcenick + "_username"])}:#{URI.escape(@registry[m.sourcenick + "_password"])}@twitter.com/statuses/update.xml"
    
    response = @bot.httputil.post(uri, "status=#{URI.escape(params[:status].to_s)}")
    debug response
    
    if response.class == Net::HTTPOK
      m.reply "status updated"
    else
      m.reply "could not update status"
    end
  end
  
  # ties a nickname to a twitter username and password
  def identify(m, params)
    @registry[m.sourcenick + "_username"] = params[:username].to_s
    @registry[m.sourcenick + "_password"] = params[:password].to_s
    m.reply "you're all setup!"
  end
end

# create an instance of our plugin class and register for the "length" command
plugin = TwitterPlugin.new
plugin.map 'twitter identify :username :password', :action => "identify", :public => false
plugin.map 'twitter update *status', :action => "update_status", :threaded => true
plugin.map 'twitter status [:nick]', :action => "get_status", :threaded => true