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
113
114
115
116
117
|
#-- 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'
require 'cgi'
class TwitterPlugin < Plugin
def initialize
super
class << @registry
def store(val)
val
end
def restore(val)
val
end
end
@header = {
'X-Twitter-Client' => 'rbot twitter plugin'
}
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, :headers => @header, :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=#{CGI.escape(params[:status].to_s)}", :headers => @header)
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
|