blackwinter-twitter2jabber 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -1
- data/Rakefile +1 -1
- data/TODO +1 -0
- data/lib/twitter2jabber/version.rb +1 -1
- data/lib/twitter2jabber.rb +44 -23
- data/sample/templates/tweet.html +2 -6
- metadata +12 -2
data/README
CHANGED
data/Rakefile
CHANGED
@@ -16,7 +16,7 @@ begin
|
|
16
16
|
:homepage => %q{http://twitter2jabber.rubyforge.org/},
|
17
17
|
:files => FileList['lib/**/*.rb', 'bin/*'].to_a,
|
18
18
|
:extra_files => FileList['[A-Z]*', 'sample/**/*'].to_a,
|
19
|
-
:dependencies => %w[twitter xmpp4r-simple highline]
|
19
|
+
:dependencies => %w[twitter xmpp4r-simple highline shorturl]
|
20
20
|
}
|
21
21
|
}}
|
22
22
|
rescue LoadError
|
data/TODO
CHANGED
data/lib/twitter2jabber.rb
CHANGED
@@ -30,6 +30,7 @@ require 'erb'
|
|
30
30
|
require 'rubygems'
|
31
31
|
require 'twitter'
|
32
32
|
require 'xmpp4r-simple'
|
33
|
+
require 'shorturl'
|
33
34
|
|
34
35
|
require 'twitter2jabber/version'
|
35
36
|
|
@@ -54,7 +55,7 @@ class Twitter2Jabber
|
|
54
55
|
new(options).run(recipients, &block)
|
55
56
|
end
|
56
57
|
|
57
|
-
attr_reader :id, :verbose, :debug, :twitter, :jabber, :filter, :formats, :templates
|
58
|
+
attr_reader :id, :verbose, :debug, :twitter, :jabber, :filter, :formats, :templates, :_erb
|
58
59
|
|
59
60
|
def initialize(options, &block)
|
60
61
|
[:twitter, :jabber].each { |client|
|
@@ -77,11 +78,16 @@ class Twitter2Jabber
|
|
77
78
|
].inject({}) { |hash, template|
|
78
79
|
hash.update(File.extname(template).sub(/\A\./, '') => File.read(template))
|
79
80
|
}
|
81
|
+
|
82
|
+
@_erb = Hash.new { |hash, format|
|
83
|
+
template = templates[format]
|
84
|
+
hash[format] = template && ERB.new(template)
|
85
|
+
}
|
80
86
|
end
|
81
87
|
|
82
88
|
def run(recipients = [], seen = {}, flag = true, &block)
|
83
89
|
deliver_tweets(recipients, seen, &block) if flag
|
84
|
-
post_messages
|
90
|
+
post_messages(recipients)
|
85
91
|
end
|
86
92
|
|
87
93
|
def loop(recipients = [], pause = nil, &block)
|
@@ -94,16 +100,16 @@ class Twitter2Jabber
|
|
94
100
|
# sleep at least one second
|
95
101
|
pause = 1 if pause < 1
|
96
102
|
|
97
|
-
i, seen =
|
103
|
+
i, seen = 1, Hash.new { |h, k| h[k] = true; false }
|
98
104
|
|
99
|
-
trap(:INT) { i =
|
100
|
-
|
101
|
-
while i
|
102
|
-
i += 1
|
105
|
+
trap(:INT) { i = -1 }
|
103
106
|
|
107
|
+
while i > 0
|
104
108
|
run(recipients, seen, i % ratio == 1, &block)
|
105
109
|
|
106
110
|
sleep pause
|
111
|
+
|
112
|
+
i += 1
|
107
113
|
end
|
108
114
|
end
|
109
115
|
|
@@ -127,9 +133,12 @@ class Twitter2Jabber
|
|
127
133
|
}
|
128
134
|
end
|
129
135
|
|
130
|
-
def post_messages
|
136
|
+
def post_messages(recipients = [])
|
137
|
+
allowed = %r{\A(?:#{recipients.map { |r| Regexp.escape(r) }.join('|')})\z}i
|
138
|
+
|
131
139
|
jabber.received_messages { |msg|
|
132
140
|
next unless msg.type == :chat
|
141
|
+
next unless msg.from.bare.to_s =~ allowed
|
133
142
|
|
134
143
|
logj msg.id
|
135
144
|
|
@@ -178,10 +187,8 @@ class Twitter2Jabber
|
|
178
187
|
msg = Jabber::Message.new.set_type(:chat)
|
179
188
|
|
180
189
|
formats.each { |format|
|
181
|
-
if
|
182
|
-
msg.add_element
|
183
|
-
ERB.new(template).result(binding)
|
184
|
-
}
|
190
|
+
if erb = _erb[format]
|
191
|
+
msg.add_element(format_element(format, erb.result(binding)))
|
185
192
|
end
|
186
193
|
}
|
187
194
|
|
@@ -189,35 +196,41 @@ class Twitter2Jabber
|
|
189
196
|
end
|
190
197
|
|
191
198
|
# cf. <http://devblog.famundo.com/articles/2006/10/18/ruby-and-xmpp-jabber-part-3-adding-html-to-the-messages>
|
192
|
-
def format_element(format)
|
199
|
+
def format_element(format, text)
|
193
200
|
body = REXML::Element.new('body')
|
194
|
-
REXML::Text.new(yield, format != 'html', body, true, nil, /.^/)
|
195
201
|
|
196
202
|
case format
|
197
203
|
when 'html'
|
204
|
+
REXML::Text.new(process_html(text), false, body, true, nil, /.^/)
|
205
|
+
|
198
206
|
html = REXML::Element.new('html').add_namespace(JABBER_NS)
|
199
207
|
html.add(body.add_namespace(XHTML_NS))
|
200
208
|
html
|
201
209
|
else
|
210
|
+
REXML::Text.new(text, true, body, true, nil, /.^/)
|
202
211
|
body
|
203
212
|
end
|
204
213
|
end
|
205
214
|
|
215
|
+
def process_html(text)
|
216
|
+
text.gsub(/((?:\A|\s)@)(\w+)/, '\1<a href="http://twitter.com/\2">\2</a>')
|
217
|
+
end
|
218
|
+
|
206
219
|
def handle_command(body, from, execute = true)
|
207
220
|
case body
|
208
221
|
when /\Ahe?(?:lp)?\z/i
|
209
222
|
deliver(from, <<-HELP) if execute
|
210
|
-
h[e[lp]]
|
223
|
+
h[e[lp]] -- Print this help
|
211
224
|
|
212
|
-
de[bug]
|
213
|
-
de[bug] on|off
|
225
|
+
de[bug] -- Print debug mode
|
226
|
+
de[bug] on|off -- Turn debug mode on/off
|
214
227
|
|
215
|
-
bl[ock] #ID
|
216
|
-
fa[v[orite]] #ID
|
228
|
+
bl[ock] #ID -- Block ID
|
229
|
+
fa[v[orite]] #ID -- Create favorite #ID
|
217
230
|
|
218
|
-
re[ply] #ID:
|
219
|
-
le[n[gth]]
|
220
|
-
|
231
|
+
re[ply] #ID[:] [!] STATUS -- Reply to ID (Force if too long)
|
232
|
+
le[n[gth]] STATUS -- Determine length
|
233
|
+
[!] STATUS -- Update status (Force if too long)
|
221
234
|
|
222
235
|
(Note: Message body must be shorter than #{MAX_LENGTH} characters)
|
223
236
|
HELP
|
@@ -256,9 +269,17 @@ le[n[gth]] ... -- Determine length
|
|
256
269
|
options[:in_reply_to_status_id] = $1
|
257
270
|
end
|
258
271
|
|
272
|
+
if body.sub!(/\A!\s+/, '')
|
273
|
+
force = true
|
274
|
+
end
|
275
|
+
|
276
|
+
body.gsub!(/https?:\/\/\S+/) { |match|
|
277
|
+
match.length < 30 ? match : ShortURL.shorten(match)
|
278
|
+
}
|
279
|
+
|
259
280
|
return body unless execute
|
260
281
|
|
261
|
-
if body.length <= MAX_LENGTH
|
282
|
+
if force || body.length <= MAX_LENGTH
|
262
283
|
update(body, options)
|
263
284
|
else
|
264
285
|
deliver(from, "MSG TOO LONG (> #{MAX_LENGTH}): #{body}")
|
data/sample/templates/tweet.html
CHANGED
@@ -1,7 +1,3 @@
|
|
1
|
-
<%= user.name %>
|
2
|
-
(<a href="http://twitter.com/<%= user.screen_name %>"><%= user.screen_name %></a>)
|
3
|
-
[<%= tweet.created_at %>]:
|
1
|
+
<%= user.name %> (<a href="http://twitter.com/<%= user.screen_name %>"><%= user.screen_name %></a>) [<%= tweet.created_at %>]:
|
4
2
|
<br /><br />
|
5
|
-
<img src="<%= user.profile_image_url %>" alt="[<%= user.screen_name %>]" />
|
6
|
-
<%= tweet.text %>
|
7
|
-
| #<%= tweet.id %>
|
3
|
+
<img src="<%= user.profile_image_url %>" alt="[<%= user.screen_name %>]" /> <%= tweet.text %> | #<%= tweet.id %>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blackwinter-twitter2jabber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jens Wille
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-08-
|
12
|
+
date: 2009-08-03 00:00:00 -07:00
|
13
13
|
default_executable: twitter2jabber
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -42,6 +42,16 @@ dependencies:
|
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: "0"
|
44
44
|
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: shorturl
|
47
|
+
type: :runtime
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
45
55
|
description: Twitter-to-Jabber gateway.
|
46
56
|
email: jens.wille@uni-koeln.de
|
47
57
|
executables:
|