termtter 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +115 -0
- data/README.rdoc +25 -10
- data/Rakefile +53 -34
- data/lib/plugins/cool.rb +2 -5
- data/lib/plugins/curry.rb +43 -0
- data/lib/plugins/db.rb +91 -0
- data/lib/plugins/{auto_reload.rb → defaults/auto_reload.rb} +0 -0
- data/lib/plugins/defaults/command_line.rb +111 -0
- data/lib/plugins/{exec.rb → defaults/exec.rb} +2 -7
- data/lib/plugins/{fib.rb → defaults/fib.rb} +1 -4
- data/lib/plugins/defaults/retweet.rb +34 -0
- data/lib/plugins/{standard_commands.rb → defaults/standard_commands.rb} +60 -136
- data/lib/plugins/defaults/standard_completion.rb +67 -0
- data/lib/plugins/{stdout.rb → defaults/stdout.rb} +30 -19
- data/lib/plugins/defaults.rb +14 -0
- data/lib/plugins/en2ja.rb +11 -5
- data/lib/plugins/english.rb +2 -2
- data/lib/plugins/expand-tinyurl.rb +27 -6
- data/lib/plugins/github-issues.rb +192 -0
- data/lib/plugins/group.rb +30 -4
- data/lib/plugins/growl.rb +10 -1
- data/lib/plugins/http_server/favicon.ico +0 -0
- data/lib/plugins/http_server/index.html +117 -0
- data/lib/plugins/http_server.rb +82 -0
- data/lib/plugins/irb.rb +6 -0
- data/lib/plugins/l2.rb +1 -1
- data/lib/plugins/list_with_opts.rb +0 -3
- data/lib/plugins/log.rb +6 -9
- data/lib/plugins/modify_arg_hook_sample.rb +3 -5
- data/lib/plugins/multi_reply.rb +0 -5
- data/lib/plugins/notify-send.rb +1 -1
- data/lib/plugins/notify-send2.rb +1 -1
- data/lib/plugins/notify-send3.rb +11 -3
- data/lib/plugins/open_url.rb +0 -8
- data/lib/plugins/otsune.rb +3 -9
- data/lib/plugins/outputz.rb +1 -1
- data/lib/plugins/pool.rb +30 -0
- data/lib/plugins/quicklook.rb +1 -1
- data/lib/plugins/saykanji.rb +81 -0
- data/lib/plugins/shell.rb +1 -6
- data/lib/plugins/sl.rb +8 -8
- data/lib/plugins/tinyurl.rb +26 -7
- data/lib/plugins/trends.rb +84 -0
- data/lib/plugins/twitpic.rb +46 -0
- data/lib/plugins/uri-open.rb +1 -1
- data/lib/plugins/wassr.rb +0 -3
- data/lib/plugins/whois.rb +45 -0
- data/lib/plugins/yhara.rb +2 -6
- data/lib/termtter/client.rb +73 -100
- data/lib/termtter/config.rb +4 -6
- data/lib/termtter/config_setup.rb +1 -1
- data/lib/termtter/hook.rb +2 -2
- data/lib/termtter/optparse.rb +14 -1
- data/lib/termtter/system_extensions.rb +3 -2
- data/lib/termtter/task_manager.rb +1 -5
- data/lib/termtter/version.rb +1 -1
- data/spec/plugins/cool_spec.rb +1 -1
- data/spec/plugins/curry_spec.rb +13 -0
- data/spec/plugins/db_spec.rb +62 -0
- data/spec/plugins/english_spec.rb +2 -2
- data/spec/plugins/fib_spec.rb +2 -2
- data/spec/plugins/filter_spec.rb +2 -2
- data/spec/plugins/pause_spec.rb +1 -1
- data/spec/plugins/primes_spec.rb +2 -2
- data/spec/plugins/shell_spec.rb +1 -1
- data/spec/plugins/sl_spec.rb +1 -1
- data/spec/plugins/{standard_plugins_spec.rb → standard_commands_spec.rb} +2 -2
- data/spec/plugins/whois_spec.rb +20 -0
- data/spec/termtter/client_spec.rb +114 -37
- data/spec/termtter/config_spec.rb +10 -0
- data/spec/termtter/optparse_spec.rb +16 -0
- data/spec/termtter_spec.rb +7 -8
- metadata +39 -19
- data/History.txt +0 -4
- data/lib/plugins/direct_messages.rb +0 -36
- data/lib/plugins/retweet.rb +0 -46
@@ -7,6 +7,8 @@ config.plugins.standard.set_default(
|
|
7
7
|
:limit_format,
|
8
8
|
'<<%=remaining_color%>><%=limit.remaining_hits%></<%=remaining_color%>>/<%=limit.hourly_limit%> until <%=limit.reset_time%> (<%=remaining_time%> remaining)')
|
9
9
|
|
10
|
+
config.set_default(:easy_reply, true)
|
11
|
+
|
10
12
|
module Termtter::Client
|
11
13
|
|
12
14
|
register_command(
|
@@ -27,13 +29,17 @@ module Termtter::Client
|
|
27
29
|
:name => :update, :alias => :u,
|
28
30
|
:exec => lambda {|arg|
|
29
31
|
unless arg.empty?
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
params =
|
33
|
+
if config.easy_reply && /^\s*(@\w+)/ =~ arg
|
34
|
+
user_name = normalize_as_user_name($1)
|
35
|
+
in_reply_to_status_id = Termtter::API.twitter.user(user_name).status.id rescue nil
|
36
|
+
in_reply_to_status_id ? {:in_reply_to_status_id => in_reply_to_status_id} : {}
|
37
|
+
else
|
38
|
+
{}
|
39
|
+
end
|
40
|
+
|
41
|
+
result = Termtter::API.twitter.update(arg, params)
|
42
|
+
puts "updated => #{result.text}"
|
37
43
|
end
|
38
44
|
},
|
39
45
|
:help => ["update,u TEXT", "Post a new message"]
|
@@ -51,7 +57,7 @@ module Termtter::Client
|
|
51
57
|
end
|
52
58
|
if id
|
53
59
|
result = Termtter::API.twitter.remove_status(id)
|
54
|
-
puts
|
60
|
+
puts "deleted => #{result.text}"
|
55
61
|
end
|
56
62
|
},
|
57
63
|
:help => ['delete,del [STATUS ID]', 'Delete a status']
|
@@ -67,8 +73,8 @@ module Termtter::Client
|
|
67
73
|
:name => :direct, :aliases => [:d],
|
68
74
|
:exec_proc => lambda {|arg|
|
69
75
|
case arg
|
70
|
-
when /^([^\s]+)\s
|
71
|
-
user, text = $1, $2
|
76
|
+
when /^([^\s]+)\s+?(.*)\s*$/
|
77
|
+
user, text = normalize_as_user_name($1), $2
|
72
78
|
Termtter::API.twitter.direct_message(user, text)
|
73
79
|
puts "=> to:#{user} message:#{text}"
|
74
80
|
when 'list'
|
@@ -87,10 +93,6 @@ module Termtter::Client
|
|
87
93
|
)
|
88
94
|
end
|
89
95
|
},
|
90
|
-
:completion_proc => lambda {|cmd, arg|
|
91
|
-
find_user_candidates(arg, "#{cmd} %s") +
|
92
|
-
["list", "sent_list"].grep(/^#{Regexp.quote(arg)}/).map { |i| "#{cmd} #{i}" }
|
93
|
-
},
|
94
96
|
:help => [
|
95
97
|
["direct,d USERNAME TEXT", "Send direct message"],
|
96
98
|
["direct,d list", 'List direct messages'],
|
@@ -101,7 +103,7 @@ module Termtter::Client
|
|
101
103
|
register_command(
|
102
104
|
:name => :profile, :aliases => [:p],
|
103
105
|
:exec_proc => lambda {|arg|
|
104
|
-
user = Termtter::API.twitter.user(arg
|
106
|
+
user = Termtter::API.twitter.user(normalize_as_user_name(arg))
|
105
107
|
attrs = %w[ name screen_name url description profile_image_url location protected following
|
106
108
|
friends_count followers_count statuses_count favourites_count
|
107
109
|
id time_zone created_at utc_offset notifications
|
@@ -112,16 +114,13 @@ module Termtter::Client
|
|
112
114
|
puts "#{attr.gsub('_', ' ').rjust(label_width)}: #{value}"
|
113
115
|
end
|
114
116
|
},
|
115
|
-
:completion_proc => lambda {|cmd, arg|
|
116
|
-
find_user_candidates arg, "#{cmd} %s"
|
117
|
-
},
|
118
117
|
:help => ["profile,p USERNAME", "Show user's profile"]
|
119
118
|
)
|
120
119
|
|
121
120
|
register_command(
|
122
121
|
:name => :followers,
|
123
122
|
:exec_proc => lambda {|arg|
|
124
|
-
user_name = arg
|
123
|
+
user_name = normalize_as_user_name(arg)
|
125
124
|
user_name = config.user_name if user_name.empty?
|
126
125
|
|
127
126
|
followers = []
|
@@ -133,9 +132,6 @@ module Termtter::Client
|
|
133
132
|
public_storage[:users] += followers.map(&:screen_name)
|
134
133
|
puts followers.map(&:screen_name).join(' ')
|
135
134
|
},
|
136
|
-
:completion_proc => lambda {|cmd, arg|
|
137
|
-
find_user_candidates arg, "#{cmd} %s"
|
138
|
-
},
|
139
135
|
:help => ["followers", "Show followers"]
|
140
136
|
)
|
141
137
|
|
@@ -147,13 +143,11 @@ module Termtter::Client
|
|
147
143
|
statuses = Termtter::API.twitter.friends_timeline
|
148
144
|
else
|
149
145
|
event = :list_user_timeline
|
150
|
-
|
146
|
+
user_name = normalize_as_user_name(arg)
|
147
|
+
statuses = Termtter::API.twitter.user_timeline(user_name)
|
151
148
|
end
|
152
149
|
output(statuses, event)
|
153
150
|
},
|
154
|
-
:completion_proc => lambda {|cmd, arg|
|
155
|
-
find_user_candidates arg, "#{cmd} %s"
|
156
|
-
},
|
157
151
|
:help => ["list,l [USERNAME]", "List the posts"]
|
158
152
|
)
|
159
153
|
|
@@ -166,7 +160,7 @@ module Termtter::Client
|
|
166
160
|
output(statuses, :search)
|
167
161
|
},
|
168
162
|
:completion_proc => lambda {|cmd, arg|
|
169
|
-
public_storage[:search_keywords].grep(
|
163
|
+
public_storage[:search_keywords].grep(/^#{Regexp.quote(arg)}/).map { |i| "#{cmd} #{i}" }
|
170
164
|
},
|
171
165
|
:help => ["search,s TEXT", "Search for Twitter"]
|
172
166
|
)
|
@@ -220,14 +214,10 @@ module Termtter::Client
|
|
220
214
|
:name => :follow, :aliases => [],
|
221
215
|
:exec_proc => lambda {|args|
|
222
216
|
args.split(' ').each do |arg|
|
223
|
-
|
224
|
-
|
225
|
-
end
|
217
|
+
user_name = normalize_as_user_name(arg)
|
218
|
+
res = Termtter::API::twitter.follow(user_name)
|
226
219
|
end
|
227
220
|
},
|
228
|
-
:completion_proc => lambda {|cmd, args|
|
229
|
-
find_user_candidates args, "#{cmd} %s"
|
230
|
-
},
|
231
221
|
:help => ['follow USER', 'Follow user']
|
232
222
|
)
|
233
223
|
|
@@ -235,14 +225,10 @@ module Termtter::Client
|
|
235
225
|
:name => :leave, :aliases => [],
|
236
226
|
:exec_proc => lambda {|args|
|
237
227
|
args.split(' ').each do |arg|
|
238
|
-
|
239
|
-
|
240
|
-
end
|
228
|
+
user_name = normalize_as_user_name(arg)
|
229
|
+
res = Termtter::API::twitter.leave(user_name)
|
241
230
|
end
|
242
231
|
},
|
243
|
-
:completion_proc => lambda {|cmd, args|
|
244
|
-
find_user_candidates args, "#{cmd} %s"
|
245
|
-
},
|
246
232
|
:help => ['leave USER', 'Leave user']
|
247
233
|
)
|
248
234
|
|
@@ -254,8 +240,8 @@ module Termtter::Client
|
|
254
240
|
when /^\d+/
|
255
241
|
id = arg.to_i
|
256
242
|
when /^@([A-Za-z0-9_]+)/
|
257
|
-
|
258
|
-
statuses = Termtter::API.twitter.user_timeline(
|
243
|
+
user_name = normalize_as_user_name($1)
|
244
|
+
statuses = Termtter::API.twitter.user_timeline(user_name)
|
259
245
|
return if statuses.empty?
|
260
246
|
id = statuses[0].id
|
261
247
|
when /^\/(.*)$/
|
@@ -274,8 +260,6 @@ module Termtter::Client
|
|
274
260
|
},
|
275
261
|
:completion_proc => lambda {|cmd, arg|
|
276
262
|
case arg
|
277
|
-
when /@(.*)/
|
278
|
-
find_user_candidates $1, "#{cmd} @%s"
|
279
263
|
when /(\d+)/
|
280
264
|
find_status_ids(arg).map{|id| "#{cmd} #{id}"}
|
281
265
|
else
|
@@ -341,7 +325,7 @@ module Termtter::Client
|
|
341
325
|
)
|
342
326
|
|
343
327
|
register_command(
|
344
|
-
:name => :exit, :aliases => [:
|
328
|
+
:name => :exit, :aliases => [:quit],
|
345
329
|
:exec_proc => lambda {|arg| exit},
|
346
330
|
:help => ['exit,e', 'Exit']
|
347
331
|
)
|
@@ -360,6 +344,9 @@ module Termtter::Client
|
|
360
344
|
end
|
361
345
|
end
|
362
346
|
helps.compact!
|
347
|
+
unless arg.empty?
|
348
|
+
helps = helps.select {|n, _| /#{arg}/ =~ n }
|
349
|
+
end
|
363
350
|
puts formatted_help(helps)
|
364
351
|
},
|
365
352
|
:help => ["help,h", "Print this help message"]
|
@@ -374,28 +361,6 @@ module Termtter::Client
|
|
374
361
|
}.join("\n")
|
375
362
|
end
|
376
363
|
|
377
|
-
# completion for standard commands
|
378
|
-
|
379
|
-
public_storage[:users] ||= Set.new
|
380
|
-
public_storage[:status_ids] ||= Set.new
|
381
|
-
|
382
|
-
register_hook(
|
383
|
-
:name => :for_completion,
|
384
|
-
:points => [:pre_filter],
|
385
|
-
:exec_proc => lambda {|statuses, event|
|
386
|
-
statuses.each do |s|
|
387
|
-
public_storage[:users].add(s.user.screen_name)
|
388
|
-
public_storage[:users] += s.text.scan(/@([a-zA-Z_0-9]*)/).flatten
|
389
|
-
public_storage[:status_ids].add(s.id)
|
390
|
-
public_storage[:status_ids].add(s.in_reply_to_status_id) if s.in_reply_to_status_id
|
391
|
-
end
|
392
|
-
}
|
393
|
-
)
|
394
|
-
|
395
|
-
public_storage[:plugins] = (Dir["#{File.dirname(__FILE__)}/*.rb"] + Dir["#{Termtter::CONF_DIR}/plugins/*.rb"]).map do |f|
|
396
|
-
f.match(%r|([^/]+).rb$|)[1]
|
397
|
-
end
|
398
|
-
|
399
364
|
register_command(
|
400
365
|
:name => :plug,
|
401
366
|
:alias => :plugin,
|
@@ -412,22 +377,29 @@ module Termtter::Client
|
|
412
377
|
end
|
413
378
|
},
|
414
379
|
:completion_proc => lambda {|cmd, args|
|
415
|
-
|
416
|
-
unless args.empty?
|
417
|
-
find_plugin_candidates args, "#{cmd} %s"
|
418
|
-
else
|
419
|
-
public_storage[:plugins].sort
|
420
|
-
end
|
380
|
+
plugin_list.grep(/^#{Regexp.quote(args)}/).map{|i| "#{cmd} #{i}"}
|
421
381
|
},
|
422
|
-
:help
|
382
|
+
:help => ['plug FILE', 'Load a plugin']
|
423
383
|
)
|
424
384
|
|
385
|
+
def self.plugin_list
|
386
|
+
(Dir["#{File.dirname(__FILE__)}/../*.rb"] + Dir["#{Termtter::CONF_DIR}/plugins/*.rb"]).
|
387
|
+
map{|f| File.basename(f).sub(/\.rb$/, '')}.
|
388
|
+
sort
|
389
|
+
end
|
390
|
+
|
425
391
|
register_command(
|
426
|
-
:name
|
392
|
+
:name => :plugins,
|
427
393
|
:exec_proc => lambda {|arg|
|
428
|
-
|
429
|
-
|
430
|
-
|
394
|
+
list = plugin_list
|
395
|
+
width = list.map{|i|i.size}.max + 2
|
396
|
+
a = []
|
397
|
+
list.sort.each_slice(4) {|i|
|
398
|
+
a << i.map{|j| j + (" " * (width - j.size))}.join
|
399
|
+
}
|
400
|
+
puts TermColor.parse('<green>' + TermColor.escape(a.join("\n")) + '</green>')
|
401
|
+
},
|
402
|
+
:help => ['plugins', 'Show list of plugins']
|
431
403
|
)
|
432
404
|
|
433
405
|
register_command(
|
@@ -457,17 +429,18 @@ module Termtter::Client
|
|
457
429
|
if s
|
458
430
|
update_with_user_and_id($2, s.user.screen_name, s.id)
|
459
431
|
end
|
460
|
-
when /^\s
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
432
|
+
when /^\s*(@\w+)/
|
433
|
+
user_name = normalize_as_user_name($1)
|
434
|
+
s = Termtter::API.twitter.user(user_name).status
|
435
|
+
if s
|
436
|
+
params = s ? {:in_reply_to_status_id => s.id} : {}
|
437
|
+
Termtter::API.twitter.update(arg, params)
|
438
|
+
puts "=> #{arg}"
|
439
|
+
end
|
465
440
|
end
|
466
441
|
},
|
467
442
|
:completion_proc => lambda {|cmd, arg|
|
468
443
|
case arg
|
469
|
-
when /(.*)@([^\s]*)$/
|
470
|
-
find_user_candidates $2, "#{cmd} #{$1}@%s"
|
471
444
|
when /(\d+)/
|
472
445
|
find_status_ids(arg).map{|id| "#{cmd} #{id}"}
|
473
446
|
end
|
@@ -502,50 +475,11 @@ module Termtter::Client
|
|
502
475
|
def self.update_with_user_and_id(text, username, id)
|
503
476
|
text = "@#{username} #{text}"
|
504
477
|
result = Termtter::API.twitter.update(text, {'in_reply_to_status_id' => id})
|
505
|
-
puts
|
478
|
+
puts "replied => #{result.text}"
|
506
479
|
end
|
507
480
|
|
508
|
-
|
509
|
-
|
510
|
-
== Usage
|
511
|
-
=== list
|
512
|
-
* ステータスリストを連番と一緒に出す。
|
513
|
-
> reply [list|ls]
|
514
|
-
0: foo: foo's message
|
515
|
-
1: bar: bar's message
|
516
|
-
..
|
517
|
-
|
518
|
-
* ユーザ指定してリスト作成。
|
519
|
-
> reply [list|ls] foo
|
520
|
-
0: foo: foo's message0
|
521
|
-
1: foo: foo's message1
|
522
|
-
|
523
|
-
=== reply
|
524
|
-
メッセージ送信の際、@usernameが自動的に付与される。
|
525
|
-
|
526
|
-
* status_idを自分で入力してreply送信
|
527
|
-
> reply 1234567890 message to status_id
|
528
|
-
=> @foo message to status_id (reply to 1234567890)
|
529
|
-
|
530
|
-
* reply listコマンドで出したステータス番号に対してreply送信
|
531
|
-
> reply up 0 message to status no
|
532
|
-
=> @foo message to status_no
|
533
|
-
|
534
|
-
* 対象ユーザの最後の発言に対してreply
|
535
|
-
> reply @foo message to foo
|
536
|
-
=> @foo message to foo
|
537
|
-
|
538
|
-
== Todo
|
539
|
-
* 英語で説明 => ヘルプを設定する
|
540
|
-
* リファクタ
|
541
|
-
* 補完
|
542
|
-
* 確認画面を出したい
|
543
|
-
=end
|
544
|
-
|
545
|
-
def self.find_plugin_candidates(a, b)
|
546
|
-
public_storage[:plugins].
|
547
|
-
grep(/^#{Regexp.quote a}/i).
|
548
|
-
map {|u| b % u }
|
481
|
+
def self.normalize_as_user_name(text)
|
482
|
+
text.strip.sub(/^@/, '')
|
549
483
|
end
|
550
484
|
|
551
485
|
def self.find_status_ids(text)
|
@@ -555,14 +489,4 @@ module Termtter::Client
|
|
555
489
|
def self.find_users(text)
|
556
490
|
public_storage[:users].select {|user| /^#{Regexp.quote(text)}/ =~ user}
|
557
491
|
end
|
558
|
-
|
559
|
-
def self.find_user_candidates(a, b)
|
560
|
-
users =
|
561
|
-
if a.nil? || a.empty?
|
562
|
-
public_storage[:users].to_a
|
563
|
-
else
|
564
|
-
public_storage[:users].grep(/^#{Regexp.quote a}/i)
|
565
|
-
end
|
566
|
-
users.map {|u| b % u }
|
567
|
-
end
|
568
492
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'set'
|
4
|
+
|
5
|
+
module Termtter::Client
|
6
|
+
|
7
|
+
#
|
8
|
+
# completion for status ids
|
9
|
+
# (I want to delete)
|
10
|
+
#
|
11
|
+
|
12
|
+
public_storage[:status_ids] ||= Set.new
|
13
|
+
|
14
|
+
register_hook(:collect_status_ids, :point => :pre_filter) do |statuses, event|
|
15
|
+
statuses.each do |s|
|
16
|
+
public_storage[:status_ids].add(s.id)
|
17
|
+
public_storage[:status_ids].add(s.in_reply_to_status_id) if s.in_reply_to_status_id
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
#
|
22
|
+
# completion for user names
|
23
|
+
#
|
24
|
+
|
25
|
+
public_storage[:users] ||= Set.new
|
26
|
+
|
27
|
+
register_hook(:collect_user_names, :point => :pre_filter) do |statuses, event|
|
28
|
+
statuses.each do |s|
|
29
|
+
public_storage[:users].add(s.user.screen_name)
|
30
|
+
public_storage[:users] += s.text.scan(/@([a-zA-Z_0-9]*)/).flatten
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
register_hook(:user_names_completion, :point => :completion) do |input|
|
35
|
+
if /(.*)@([^\s]*)$/ =~ input
|
36
|
+
command_str = $1
|
37
|
+
part_of_user_name = $2
|
38
|
+
|
39
|
+
users =
|
40
|
+
if part_of_user_name.nil? || part_of_user_name.empty?
|
41
|
+
public_storage[:users].to_a
|
42
|
+
else
|
43
|
+
public_storage[:users].grep(/^#{Regexp.quote(part_of_user_name)}/)
|
44
|
+
end
|
45
|
+
|
46
|
+
users.map {|u| "#{command_str}@%s" % u }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# completion for hashtags
|
52
|
+
#
|
53
|
+
|
54
|
+
public_storage[:hashtag] ||= Set.new
|
55
|
+
|
56
|
+
register_hook(:collect_hashtags, :point => /^post_exec_/) do |cmd, arg, result|
|
57
|
+
public_storage[:hashtag] += arg.scan(/\s+#([^\s]+)/).flatten if arg
|
58
|
+
end
|
59
|
+
|
60
|
+
register_hook(:hashtags_completion, :point => :completion) do |input|
|
61
|
+
if /(.*)#([^\s]*)$/ =~ input
|
62
|
+
command_str = $1
|
63
|
+
part_of_hashtag = $2
|
64
|
+
public_storage[:hashtag].grep(/^#{Regexp.quote(part_of_hashtag)}/i).map { |i| "#{command_str}##{i}" }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -15,6 +15,7 @@ config.plugins.stdout.set_default(:pager, 'less -R -f +G')
|
|
15
15
|
config.plugins.stdout.set_default(:window_height, 50)
|
16
16
|
config.plugins.stdout.set_default(:typable_ids, ('aa'..'zz').to_a)
|
17
17
|
config.plugins.stdout.set_default(:typable_id_prefix, '$')
|
18
|
+
config.plugins.stdout.set_default(:show_as_thread, false)
|
18
19
|
|
19
20
|
module Termtter
|
20
21
|
class TypableIdGenerator
|
@@ -78,25 +79,7 @@ module Termtter
|
|
78
79
|
|
79
80
|
output_text = ''
|
80
81
|
statuses.each do |s|
|
81
|
-
|
82
|
-
color = config.plugins.stdout.colors[s.user.id.to_i % config.plugins.stdout.colors.size]
|
83
|
-
status_id = Termtter::Client.data_to_typable_id(s.id)
|
84
|
-
reply_to_status_id =
|
85
|
-
if s.in_reply_to_status_id.nil?
|
86
|
-
nil
|
87
|
-
else
|
88
|
-
Termtter::Client.data_to_typable_id(s.in_reply_to_status_id)
|
89
|
-
end
|
90
|
-
|
91
|
-
time = "(#{Time.parse(s.created_at).strftime(time_format)})"
|
92
|
-
source =
|
93
|
-
case s.source
|
94
|
-
when />(.*?)</ then $1
|
95
|
-
when 'web' then 'web'
|
96
|
-
end
|
97
|
-
|
98
|
-
erbed_text = ERB.new(config.plugins.stdout.timeline_format).result(binding)
|
99
|
-
output_text << TermColor.parse(erbed_text) + "\n"
|
82
|
+
output_text << status_line(s, time_format)
|
100
83
|
end
|
101
84
|
|
102
85
|
if config.plugins.stdout.enable_pager && ENV['LINES'] && statuses.size > ENV['LINES'].to_i
|
@@ -109,6 +92,34 @@ module Termtter
|
|
109
92
|
print output_text
|
110
93
|
end
|
111
94
|
end
|
95
|
+
|
96
|
+
def status_line(s, time_format, indent = 0)
|
97
|
+
return '' unless s
|
98
|
+
text = TermColor.escape(s.text)
|
99
|
+
color = config.plugins.stdout.colors[s.user.id.to_i % config.plugins.stdout.colors.size]
|
100
|
+
status_id = Termtter::Client.data_to_typable_id(s.id)
|
101
|
+
reply_to_status_id =
|
102
|
+
if s.in_reply_to_status_id.nil?
|
103
|
+
nil
|
104
|
+
else
|
105
|
+
Termtter::Client.data_to_typable_id(s.in_reply_to_status_id)
|
106
|
+
end
|
107
|
+
|
108
|
+
time = "(#{Time.parse(s.created_at).strftime(time_format)})"
|
109
|
+
source =
|
110
|
+
case s.source
|
111
|
+
when />(.*?)</ then $1
|
112
|
+
when 'web' then 'web'
|
113
|
+
end
|
114
|
+
|
115
|
+
erbed_text = ERB.new(config.plugins.stdout.timeline_format).result(binding)
|
116
|
+
indent_text = indent > 0 ? "#{' ' * (indent - 1)} ┗ " : ''
|
117
|
+
text = TermColor.parse(indent_text + erbed_text) + "\n"
|
118
|
+
if config.plugins.stdout.show_as_thread && s.in_reply_to_status_id
|
119
|
+
text << status_line(Status[s.in_reply_to_status_id], time_format, indent + 1)
|
120
|
+
end
|
121
|
+
text
|
122
|
+
end
|
112
123
|
end
|
113
124
|
|
114
125
|
Client.register_hook(StdOut.new)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Termtter::Client
|
4
|
+
config.set_default(:stdout, true)
|
5
|
+
config.set_default(:standard_commands, true)
|
6
|
+
config.set_default(:standard_completion, true)
|
7
|
+
config.set_default(:auto_reload, true)
|
8
|
+
|
9
|
+
defaults = Dir[File.dirname(__FILE__) + '/defaults/*.rb'].map { |f|
|
10
|
+
f.match(%r|defaults/(.*?).rb$|)[1]
|
11
|
+
}.each { |plugin|
|
12
|
+
plug "defaults/#{plugin}" if config.__refer__(plugin.to_sym)
|
13
|
+
}
|
14
|
+
end
|
data/lib/plugins/en2ja.rb
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
|
3
|
+
module Termtter::Client
|
4
|
+
plug 'translation'
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
register_hook(:en2ja, :point => :filter_for_output) do |statuses, event|
|
7
|
+
statuses.each do |s|
|
8
|
+
if english?(s.text)
|
9
|
+
s.text = translate(s.text, 'en|ja')
|
10
|
+
end
|
9
11
|
end
|
10
12
|
end
|
13
|
+
|
14
|
+
def self.english?(text)
|
15
|
+
/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+/ !~ text
|
16
|
+
end
|
11
17
|
end
|
data/lib/plugins/english.rb
CHANGED
@@ -20,6 +20,6 @@ end
|
|
20
20
|
# select English posts only
|
21
21
|
#
|
22
22
|
# config sample:
|
23
|
-
#
|
23
|
+
# t.plug 'english'
|
24
24
|
# or,
|
25
|
-
#
|
25
|
+
# t.plug 'english', :only => [:list_friends_timeline, :update_friends_timeline]
|
@@ -4,13 +4,34 @@ URL_SHORTTERS = [
|
|
4
4
|
{ :host => "tinyurl.com", :pattern => %r'(http://tinyurl\.com(/[\w/]+))' },
|
5
5
|
{ :host => "is.gd", :pattern => %r'(http://is\.gd(/[\w/]+))' },
|
6
6
|
{ :host => "bit.ly", :pattern => %r'(http://bit\.ly(/[\w/]+))' },
|
7
|
-
{ :host => "ff.im", :pattern => %r'(http://ff\.im(/[
|
7
|
+
{ :host => "ff.im", :pattern => %r'(http://ff\.im(/[-\w/]+))'},
|
8
8
|
]
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
config.plugins.expand_tinyurl.set_default(:shortters, [])
|
11
|
+
config.plugins.expand_tinyurl.set_default(:skip_users, [])
|
12
|
+
|
13
|
+
# for Ruby 1.8
|
14
|
+
unless String.public_method_defined?(:force_encoding)
|
15
|
+
class String
|
16
|
+
def force_encoding(enc)
|
17
|
+
self
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module Encoding
|
22
|
+
UTF_8 = nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
Termtter::Client::register_hook(
|
27
|
+
:name => :expand_tinyurl,
|
28
|
+
:point => :filter_for_output,
|
29
|
+
:exec_proc => lambda do |statuses, event|
|
30
|
+
shortters = URL_SHORTTERS + config.plugins.expand_tinyurl.shortters
|
31
|
+
skip_users = config.plugins.expand_tinyurl.skip_users
|
12
32
|
statuses.each do |s|
|
13
|
-
|
33
|
+
skip_users.include?(s.user.screen_name) and next
|
34
|
+
shortters.each do |site|
|
14
35
|
s.text.gsub!(site[:pattern]) do |m|
|
15
36
|
expand_url(site[:host], $2) || $1
|
16
37
|
end
|
@@ -18,7 +39,7 @@ module Termtter::Client
|
|
18
39
|
end
|
19
40
|
statuses
|
20
41
|
end
|
21
|
-
|
42
|
+
)
|
22
43
|
|
23
44
|
def expand_url(host, path)
|
24
45
|
http_class = Net::HTTP
|
@@ -30,5 +51,5 @@ def expand_url(host, path)
|
|
30
51
|
end
|
31
52
|
res = http_class.new(host).head(path)
|
32
53
|
return nil unless res.code == "301" or res.code == "302"
|
33
|
-
res['Location']
|
54
|
+
res['Location'].force_encoding(Encoding::UTF_8)
|
34
55
|
end
|