termtter 1.6.0 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/README.rdoc +2 -2
- data/Rakefile +41 -75
- data/VERSION +1 -0
- data/bin/termtter +9 -2
- data/doc/Termtter-1.0-Release-Note-English.txt +37 -0
- data/doc/Termtter-1.0-Release-Note.txt +37 -0
- data/lib/plugins/another_prompt.rb +8 -8
- data/lib/plugins/ar.rb +102 -0
- data/lib/plugins/async.rb +1 -1
- data/lib/plugins/babelfish.rb +34 -0
- data/lib/plugins/confirm.rb +2 -0
- data/lib/plugins/crypt.rb +44 -0
- data/lib/plugins/defaults/auto_reload.rb +1 -1
- data/lib/plugins/defaults/command_line.rb +34 -17
- data/lib/plugins/defaults/confirm.rb +30 -0
- data/lib/plugins/defaults/hashtag.rb +1 -1
- data/lib/plugins/defaults/irb.rb +30 -0
- data/lib/plugins/defaults/keyword.rb +58 -0
- data/lib/plugins/defaults/list.rb +155 -0
- data/lib/plugins/defaults/plugin.rb +59 -0
- data/lib/plugins/defaults/retweet.rb +75 -23
- data/lib/plugins/defaults/standard_commands.rb +60 -87
- data/lib/plugins/defaults/standard_completion.rb +25 -15
- data/lib/plugins/defaults/stdout.rb +49 -10
- data/lib/plugins/defaults/switch.rb +1 -1
- data/lib/plugins/defaults/users.rb +63 -0
- data/lib/plugins/draft.rb +58 -0
- data/lib/plugins/expand-tinyurl.rb +5 -9
- data/lib/plugins/favotter.rb +1 -1
- data/lib/plugins/footer.rb +22 -0
- data/lib/plugins/friends.rb +5 -4
- data/lib/plugins/g.rb +9 -16
- data/lib/plugins/gem_install.rb +24 -0
- data/lib/plugins/gist.rb +20 -0
- data/lib/plugins/grass.rb +1 -1
- data/lib/plugins/gyazo.rb +78 -0
- data/lib/plugins/http_server.rb +1 -1
- data/lib/plugins/hugeurl.rb +6 -13
- data/lib/plugins/irc_gw.rb +15 -11
- data/lib/plugins/me.rb +1 -1
- data/lib/plugins/notify-send.rb +1 -1
- data/lib/plugins/notify-send3.rb +1 -1
- data/lib/plugins/open.rb +1 -1
- data/lib/plugins/open_url.rb +5 -1
- data/lib/plugins/pool.rb +1 -1
- data/lib/plugins/random.rb +1 -1
- data/lib/plugins/reply_retweet.rb +42 -0
- data/lib/plugins/screen-notify.rb +1 -1
- data/lib/plugins/sl.rb +3 -3
- data/lib/plugins/storage.rb +7 -10
- data/lib/plugins/storage/sqlite3.rb +155 -0
- data/lib/plugins/storage/status.rb +2 -0
- data/lib/plugins/stream.rb +1 -1
- data/lib/plugins/tinyurl.rb +3 -9
- data/lib/plugins/trends.rb +2 -2
- data/lib/plugins/truncate.rb +1 -1
- data/lib/plugins/w3mimg.rb +1 -1
- data/lib/termtter.rb +19 -20
- data/lib/termtter/active_rubytter.rb +4 -0
- data/lib/termtter/api.rb +22 -5
- data/lib/termtter/client.rb +55 -40
- data/lib/termtter/command.rb +3 -2
- data/lib/termtter/config_setup.rb +1 -1
- data/lib/termtter/config_template.erb +5 -0
- data/lib/termtter/default_config.rb +18 -0
- data/lib/termtter/hookable.rb +1 -0
- data/lib/termtter/httppool.rb +44 -0
- data/lib/termtter/memory_cache.rb +32 -0
- data/lib/termtter/optparse.rb +8 -15
- data/lib/termtter/rubytter_proxy.rb +65 -4
- data/lib/termtter/system_extensions.rb +40 -9
- data/lib/termtter/task.rb +2 -1
- data/spec/plugins/defaults/hashtag_spec.rb +8 -7
- data/spec/plugins/defaults/list_spec.rb +33 -0
- data/spec/plugins/defaults/plugin_spec.rb +17 -0
- data/spec/plugins/defaults/retweet_spec.rb +205 -0
- data/spec/plugins/draft_spec.rb +59 -0
- data/spec/plugins/expand-tinyurl_spec.rb +21 -0
- data/spec/plugins/footer_spec.rb +50 -0
- data/spec/plugins/storage/sqlite3_spec.rb +41 -0
- data/spec/termtter/api_spec.rb +1 -1
- data/spec/termtter/client_spec.rb +21 -21
- data/spec/termtter/command_spec.rb +8 -8
- data/spec/termtter/config_spec.rb +2 -2
- data/spec/termtter/memory_cache_spec.rb +20 -0
- data/spec/termtter/optparse_spec.rb +1 -1
- data/spec/termtter/rubytter_proxy_spec.rb +38 -0
- data/spec/termtter/system_extensions_spec.rb +25 -23
- data/spec/termtter/task_manager_spec.rb +1 -1
- data/spec/termtter_spec.rb +4 -2
- metadata +88 -19
- data/lib/plugins/defaults/lists.rb +0 -14
- data/lib/plugins/irb.rb +0 -6
- data/lib/plugins/storage/DB.rb +0 -37
- data/lib/termtter/version.rb +0 -4
- data/spec/plugins/defaults/lists_spec.rb +0 -34
- data/spec/plugins/storage/DB_spec_.rb +0 -12
@@ -1,43 +1,95 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
config.plugins.retweet.set_default(
|
4
|
-
|
3
|
+
config.plugins.retweet.set_default(
|
4
|
+
:format, '<%= comment %><%= rt_or_qt %> @<%=s.user.screen_name%>: <%=s.text%>')
|
5
|
+
config.plugins.retweet.set_default(
|
6
|
+
:confirm_protected, true)
|
7
|
+
config.plugins.retweet.set_default(
|
8
|
+
:official_retweet, true)
|
9
|
+
config.plugins.retweet.set_default(
|
10
|
+
:quotetweet, false)
|
5
11
|
|
6
12
|
module Termtter::Client
|
7
13
|
def self.post_retweet(s, comment = nil)
|
8
|
-
|
9
|
-
|
14
|
+
s.user.protected and
|
15
|
+
config.plugins.retweet.confirm_protected and
|
16
|
+
!confirm("#{s.user.screen_name} is protected! Are you sure?", false) and
|
10
17
|
return
|
11
|
-
end
|
12
18
|
|
19
|
+
# NOTE: If it's possible, this plugin tries to
|
20
|
+
# use the default RT feature twitter provides.
|
21
|
+
if comment.nil? && config.plugins.retweet.official_retweet
|
22
|
+
begin
|
23
|
+
Termtter::API.twitter.retweet(s.id)
|
24
|
+
# TODO: Vimshell support
|
25
|
+
puts TermColor.parse("<blue>=> RT @#{s.user.screen_name}: #{s.text}</blue>")
|
26
|
+
return
|
27
|
+
rescue Rubytter::APIError # XXX: just for transition period
|
28
|
+
if $!.to_s == 'Not found'
|
29
|
+
Termtter::Client.logger.warn "Failed official retweet. Set twitter langage to English in https://twitter.com/account/settings or set config.plugins.retweet.official_retweet to false."
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
13
33
|
comment += ' ' unless comment.nil?
|
34
|
+
rt_or_qt = (config.plugins.retweet.quotetweet and comment) ? 'QT' : 'RT'
|
14
35
|
text = ERB.new(config.plugins.retweet.format).result(binding)
|
15
36
|
Termtter::API.twitter.update(text)
|
16
37
|
puts "=> #{text}"
|
17
|
-
|
18
|
-
return text
|
19
38
|
end
|
20
39
|
|
21
40
|
register_command(
|
22
|
-
:name
|
23
|
-
:
|
24
|
-
:help
|
25
|
-
:
|
41
|
+
:name => :retweet,
|
42
|
+
:alias => :rt,
|
43
|
+
:help => ['retweet,rt (ID|@USER)', 'Post a retweet message'],
|
44
|
+
:exec => lambda {|arg|
|
26
45
|
arg, comment = arg.split(/\s/, 2)
|
27
46
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
statuses = Termtter::API.twitter.user_timeline(user)
|
37
|
-
return if statuses.empty?
|
38
|
-
post_retweet(statuses[0], comment)
|
39
|
-
end
|
47
|
+
case arg
|
48
|
+
when /(\d+)/
|
49
|
+
post_retweet(Termtter::API.twitter.show(arg), comment)
|
50
|
+
when /@([A-Za-z0-9_]+)/
|
51
|
+
user = $1
|
52
|
+
statuses = Termtter::API.twitter.user_timeline(user)
|
53
|
+
return if statuses.empty?
|
54
|
+
post_retweet(statuses[0], comment)
|
40
55
|
end
|
41
56
|
}
|
42
57
|
)
|
58
|
+
|
59
|
+
register_command(
|
60
|
+
:name => :retweets,
|
61
|
+
:help => ['retweets ID', 'Show retweets of a tweet'],
|
62
|
+
:exec => lambda {|arg|
|
63
|
+
statuses = Termtter::API.twitter.retweets(arg)
|
64
|
+
output(statuses, :retweets)
|
65
|
+
}
|
66
|
+
)
|
67
|
+
|
68
|
+
register_command(
|
69
|
+
:name => :retweeted_by_me,
|
70
|
+
:help => ['retweeted_by_me', 'Show retweets posted by you.'],
|
71
|
+
:exec => lambda {|arg|
|
72
|
+
statuses = Termtter::API.twitter.retweeted_by_me
|
73
|
+
output(statuses, :retweeted_by_me)
|
74
|
+
}
|
75
|
+
)
|
76
|
+
|
77
|
+
register_command(
|
78
|
+
:name => :retweeted_to_me,
|
79
|
+
:help => ['retweeted_to_me', 'Show retweets posted by friends.'],
|
80
|
+
:exec => lambda {|arg|
|
81
|
+
statuses = Termtter::API.twitter.retweeted_to_me
|
82
|
+
output(statuses, :retweeted_to_me)
|
83
|
+
}
|
84
|
+
)
|
85
|
+
|
86
|
+
register_command(
|
87
|
+
:name => :retweets_of_me,
|
88
|
+
:help => ['retweets_of_me',
|
89
|
+
'Show tweets of you that have been retweeted by others.'],
|
90
|
+
:exec => lambda {|arg|
|
91
|
+
statuses = Termtter::API.twitter.retweets_of_me
|
92
|
+
output(statuses, :retweets_of_me)
|
93
|
+
}
|
94
|
+
)
|
43
95
|
end
|
@@ -7,7 +7,7 @@ config.plugins.standard.set_default(
|
|
7
7
|
:limit_format,
|
8
8
|
'<<%=remaining_color%>><%=limit.remaining_hits%></<%=remaining_color%>>/<%=limit.hourly_limit%> until <%=Time.parse(limit.reset_time).getlocal%> (<%=remaining_time%> remaining)')
|
9
9
|
|
10
|
-
config.set_default(:easy_reply,
|
10
|
+
config.set_default(:easy_reply, false)
|
11
11
|
|
12
12
|
module Termtter::Client
|
13
13
|
|
@@ -15,20 +15,21 @@ module Termtter::Client
|
|
15
15
|
:name => :reload,
|
16
16
|
:exec => lambda {|arg|
|
17
17
|
args = @since_id ? [{:since_id => @since_id}] : []
|
18
|
-
statuses = Termtter::API.twitter.
|
18
|
+
statuses = Termtter::API.twitter.home_timeline(*args)
|
19
19
|
unless statuses.empty?
|
20
20
|
print "\e[0G" + "\e[K" unless win?
|
21
21
|
@since_id = statuses[0].id
|
22
22
|
output(statuses, :update_friends_timeline)
|
23
23
|
Readline.refresh_line if arg =~ /\-r/
|
24
24
|
end
|
25
|
-
}
|
25
|
+
},
|
26
|
+
:help => ['reload', 'Reload time line']
|
26
27
|
)
|
27
28
|
|
28
29
|
register_command(
|
29
30
|
:name => :update, :alias => :u,
|
30
31
|
:exec => lambda {|arg|
|
31
|
-
unless arg.
|
32
|
+
unless arg.empty?
|
32
33
|
params =
|
33
34
|
if config.easy_reply && /^\s*(@\w+)/ =~ arg
|
34
35
|
user_name = normalize_as_user_name($1)
|
@@ -39,7 +40,12 @@ module Termtter::Client
|
|
39
40
|
end
|
40
41
|
|
41
42
|
result = Termtter::API.twitter.update(arg, params)
|
42
|
-
|
43
|
+
|
44
|
+
if result.text == arg
|
45
|
+
puts "updated => #{result.text}"
|
46
|
+
else
|
47
|
+
puts TermColor.parse("<red>Failed to update :(</red>")
|
48
|
+
end
|
43
49
|
end
|
44
50
|
},
|
45
51
|
:help => ["update,u TEXT", "Post a new message"]
|
@@ -63,60 +69,39 @@ module Termtter::Client
|
|
63
69
|
:help => ['delete,del [STATUS ID]', 'Delete a status']
|
64
70
|
)
|
65
71
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
72
|
+
unless defined? DirectMessage
|
73
|
+
class DirectMessage < Struct.new(:id, :text, :user, :created_at)
|
74
|
+
def method_missing(*args, &block)
|
75
|
+
nil
|
76
|
+
end
|
70
77
|
end
|
71
78
|
end
|
72
|
-
register_command(
|
73
|
-
:name => :direct, :aliases => [:d],
|
74
|
-
:exec_proc => lambda {|arg|
|
75
|
-
case arg
|
76
|
-
when /^([^\s]+)\s+?(.*)\s*$/
|
77
|
-
user, text = normalize_as_user_name($1), $2
|
78
|
-
Termtter::API.twitter.direct_message(user, text)
|
79
|
-
puts "=> to:#{user} message:#{text}"
|
80
|
-
when 'list'
|
81
|
-
output(
|
82
|
-
Termtter::API.twitter.direct_messages.map { |d|
|
83
|
-
direct_message_struct.new(d.id, "#{d.text} => #{d.recipient_screen_name}", d.sender, d.created_at)
|
84
|
-
},
|
85
|
-
:direct_messages
|
86
|
-
)
|
87
|
-
when 'sent_list'
|
88
|
-
output(
|
89
|
-
Termtter::API.twitter.sent_direct_messages.map { |d|
|
90
|
-
direct_message_struct.new(d.id, "#{d.text} => #{d.recipient_screen_name}", d.sender, d.created_at)
|
91
|
-
},
|
92
|
-
:direct_messages
|
93
|
-
)
|
94
|
-
end
|
95
|
-
},
|
96
|
-
:help => [
|
97
|
-
["direct,d USERNAME TEXT", "Send direct message"],
|
98
|
-
["direct,d list", 'List direct messages'],
|
99
|
-
["direct,d sent_list", 'List sent direct messages']
|
100
|
-
]
|
101
|
-
)
|
102
79
|
|
103
|
-
register_command(
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
80
|
+
register_command(:direct, :alias => :d, :help => ["direct,d USERNAME TEXT", "Send direct message"]) do |arg|
|
81
|
+
if /^([^\s]+)\s+?(.*)\s*$/ =~ arg
|
82
|
+
user, text = normalize_as_user_name($1), $2
|
83
|
+
Termtter::API.twitter.direct_message(user, text)
|
84
|
+
puts "=> to:#{user} message:#{text}"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
register_command('direct list', :help => ["direct,d list", 'List direct messages']) do |arg|
|
89
|
+
output(
|
90
|
+
Termtter::API.twitter.direct_messages.map { |d|
|
91
|
+
DirectMessage.new(d.id, "#{d.text} => #{d.recipient_screen_name}", d.sender, d.created_at)
|
92
|
+
},
|
93
|
+
:direct_messages
|
94
|
+
)
|
95
|
+
end
|
96
|
+
|
97
|
+
register_command('direct sent_list', :help => ["direct,d sent_list", 'List sent direct messages']) do |arg|
|
98
|
+
output(
|
99
|
+
Termtter::API.twitter.sent_direct_messages.map { |d|
|
100
|
+
DirectMessage.new(d.id, "#{d.text} => #{d.recipient_screen_name}", d.sender, d.created_at)
|
101
|
+
},
|
102
|
+
:direct_messages
|
103
|
+
)
|
104
|
+
end
|
120
105
|
|
121
106
|
register_command(
|
122
107
|
:name => :followers,
|
@@ -125,10 +110,12 @@ module Termtter::Client
|
|
125
110
|
user_name = config.user_name if user_name.empty?
|
126
111
|
|
127
112
|
followers = []
|
128
|
-
|
113
|
+
cursor = -1
|
129
114
|
begin
|
130
|
-
|
131
|
-
|
115
|
+
tmp = Termtter::API.twitter.followers(user_name, :cursor => cursor)
|
116
|
+
cursor = tmp[:next_cursor]
|
117
|
+
followers += tmp[:users]
|
118
|
+
end until cursor.zero?
|
132
119
|
Termtter::Client.public_storage[:followers] = followers
|
133
120
|
public_storage[:users] += followers.map(&:screen_name)
|
134
121
|
puts followers.map(&:screen_name).join(' ')
|
@@ -136,32 +123,6 @@ module Termtter::Client
|
|
136
123
|
:help => ["followers", "Show followers"]
|
137
124
|
)
|
138
125
|
|
139
|
-
register_command(
|
140
|
-
:name => :list, :aliases => [:l],
|
141
|
-
:exec_proc => lambda {|arg|
|
142
|
-
if arg =~ /\-([\d]+)/
|
143
|
-
options = {:count => $1}
|
144
|
-
arg = arg.gsub(/\-([\d]+)/, '')
|
145
|
-
else
|
146
|
-
options = {}
|
147
|
-
end
|
148
|
-
|
149
|
-
if arg.empty?
|
150
|
-
event = :list_friends_timeline
|
151
|
-
statuses = Termtter::API.twitter.friends_timeline(options)
|
152
|
-
else
|
153
|
-
event = :list_user_timeline
|
154
|
-
statuses = []
|
155
|
-
Array(arg.split).each do |user|
|
156
|
-
user_name = normalize_as_user_name(user)
|
157
|
-
statuses += Termtter::API.twitter.user_timeline(user_name, options)
|
158
|
-
end
|
159
|
-
end
|
160
|
-
output(statuses, event)
|
161
|
-
},
|
162
|
-
:help => ["list,l [USERNAME] [-COUNT]", "List the posts"]
|
163
|
-
)
|
164
|
-
|
165
126
|
class SearchEvent; attr_reader :query; def initialize(query); @query = query end; end
|
166
127
|
public_storage[:search_keywords] = Set.new
|
167
128
|
register_command(
|
@@ -190,7 +151,14 @@ module Termtter::Client
|
|
190
151
|
register_command(
|
191
152
|
:name => :replies, :aliases => [:r],
|
192
153
|
:exec_proc => lambda {|arg|
|
193
|
-
|
154
|
+
if arg =~ /\-([\d]+)/
|
155
|
+
options = {:count => $1}
|
156
|
+
arg = arg.gsub(/\-([\d]+)/, '')
|
157
|
+
else
|
158
|
+
options = {}
|
159
|
+
end
|
160
|
+
|
161
|
+
res = Termtter::API.twitter.replies(options)
|
194
162
|
unless arg.empty?
|
195
163
|
res = res.map {|e| e.user.screen_name == arg ? e : nil }.compact
|
196
164
|
end
|
@@ -254,6 +222,11 @@ module Termtter::Client
|
|
254
222
|
:help => ['leave USER', 'Leave user']
|
255
223
|
)
|
256
224
|
|
225
|
+
help = ['favorite_list USERNAME', 'show user favorites']
|
226
|
+
register_command(:favorites, :alias => :favlist, :help => help) do |arg|
|
227
|
+
output Termtter::API.twitter.favorites(arg), :user_timeline
|
228
|
+
end
|
229
|
+
|
257
230
|
register_command(
|
258
231
|
:name => :favorite, :aliases => [:fav],
|
259
232
|
:exec_proc => lambda {|arg|
|
@@ -471,7 +444,7 @@ module Termtter::Client
|
|
471
444
|
return if i <= 0
|
472
445
|
end while input == "redo" or input == "."
|
473
446
|
begin
|
474
|
-
Termtter::Client.
|
447
|
+
Termtter::Client.execute(input)
|
475
448
|
rescue CommandNotFound => e
|
476
449
|
warn "Unknown command \"#{e}\""
|
477
450
|
warn 'Enter "help" for instructions'
|
@@ -4,20 +4,6 @@ require 'set'
|
|
4
4
|
|
5
5
|
module Termtter::Client
|
6
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
7
|
#
|
22
8
|
# completion for user names
|
23
9
|
#
|
@@ -53,9 +39,19 @@ module Termtter::Client
|
|
53
39
|
|
54
40
|
public_storage[:hashtags_for_completion] ||= Set.new
|
55
41
|
|
42
|
+
def self.collect_hashtags(text)
|
43
|
+
text.force_encoding("UTF-8") if text.respond_to?(:force_encoding)
|
44
|
+
public_storage[:hashtags_for_completion] += text.scan(/#([0-9A-Za-z_]+)/u).flatten
|
45
|
+
end
|
46
|
+
|
47
|
+
Termtter::RubytterProxy.register_hook(:collect_hashtags, :point => :post_update) do |*args|
|
48
|
+
collect_hashtags(args.first)
|
49
|
+
args
|
50
|
+
end
|
51
|
+
|
56
52
|
register_hook(:collect_hashtags, :point => :pre_filter) do |statuses, event|
|
57
53
|
statuses.each do |s|
|
58
|
-
|
54
|
+
collect_hashtags(s.text)
|
59
55
|
end
|
60
56
|
end
|
61
57
|
|
@@ -69,4 +65,18 @@ module Termtter::Client
|
|
69
65
|
map { |i| "#{command_str} ##{i}" }
|
70
66
|
end
|
71
67
|
end
|
68
|
+
|
69
|
+
#
|
70
|
+
# completion for lists
|
71
|
+
#
|
72
|
+
|
73
|
+
register_hook(:lists_completion, :point => :completion) do |input|
|
74
|
+
if /(.*)\s([^\s]*)$/ =~ input
|
75
|
+
command = $1
|
76
|
+
part_of_list_name = $2
|
77
|
+
public_storage[:lists].
|
78
|
+
grep(/#{Regexp.quote(part_of_list_name)}/i).
|
79
|
+
map {|u| "#{command} %s" % u }
|
80
|
+
end
|
81
|
+
end
|
72
82
|
end
|
@@ -7,8 +7,16 @@ require 'tempfile'
|
|
7
7
|
config.plugins.stdout.set_default(:colors, (31..36).to_a + (91..96).to_a)
|
8
8
|
config.plugins.stdout.set_default(
|
9
9
|
:timeline_format,
|
10
|
-
|
11
|
-
|
10
|
+
[
|
11
|
+
'<90><%=time%> [<%=status_id%>]</90> ',
|
12
|
+
'<%= indent_text %>',
|
13
|
+
'<<%=color%>><%=s.user.screen_name%>: <%=colorize_users(text)%></<%=color%>> ',
|
14
|
+
'<90>',
|
15
|
+
'<%=reply_to_status_id ? " (reply_to [#{reply_to_status_id}]) " : ""%>',
|
16
|
+
'<%=retweeted_status_id ? " (retweet_to [#{retweeted_status_id}]) " : ""%>',
|
17
|
+
'<%=source%><%=s.user.protected ? "[P]" : ""%>',
|
18
|
+
'</90>'
|
19
|
+
].join('')
|
12
20
|
)
|
13
21
|
config.plugins.stdout.set_default(:time_format_today, '%H:%M:%S')
|
14
22
|
config.plugins.stdout.set_default(:time_format_not_today, '%y/%m/%d %H:%M')
|
@@ -17,7 +25,9 @@ config.plugins.stdout.set_default(:pager, 'less -R -f +G')
|
|
17
25
|
config.plugins.stdout.set_default(:window_height, 50)
|
18
26
|
config.plugins.stdout.set_default(:typable_ids, ('aa'..'zz').to_a)
|
19
27
|
config.plugins.stdout.set_default(:typable_id_prefix, '$')
|
20
|
-
config.plugins.stdout.set_default(:
|
28
|
+
config.plugins.stdout.set_default(:show_reply_chain, true)
|
29
|
+
config.plugins.stdout.set_default(:indent_format, %q("#{' ' * (indent - 1)} → "))
|
30
|
+
config.plugins.stdout.set_default(:max_indent_level, 1)
|
21
31
|
|
22
32
|
module Termtter
|
23
33
|
class TypableIdGenerator
|
@@ -109,10 +119,17 @@ module Termtter
|
|
109
119
|
color = config.plugins.stdout.colors[s.user.id.to_i % config.plugins.stdout.colors.size]
|
110
120
|
status_id = Termtter::Client.data_to_typable_id(s.id)
|
111
121
|
reply_to_status_id =
|
112
|
-
if s.in_reply_to_status_id
|
122
|
+
if s.in_reply_to_status_id
|
123
|
+
Termtter::Client.data_to_typable_id(s.in_reply_to_status_id)
|
124
|
+
else
|
113
125
|
nil
|
126
|
+
end
|
127
|
+
|
128
|
+
retweeted_status_id =
|
129
|
+
if s.retweeted_status
|
130
|
+
Termtter::Client.data_to_typable_id(s.retweeted_status.id)
|
114
131
|
else
|
115
|
-
|
132
|
+
nil
|
116
133
|
end
|
117
134
|
|
118
135
|
time = "(#{Time.parse(s.created_at).strftime(time_format)})"
|
@@ -122,18 +139,40 @@ module Termtter
|
|
122
139
|
when 'web' then 'web'
|
123
140
|
end
|
124
141
|
|
142
|
+
indent_text = indent > 0 ? eval(config.plugins.stdout.indent_format) : ''
|
125
143
|
erbed_text = ERB.new(config.plugins.stdout.timeline_format).result(binding)
|
126
|
-
indent_text = indent > 0 ? "#{' ' * (indent - 1)} ┗ " : ''
|
127
144
|
|
128
145
|
erbed_text = Client.get_hooks(:pre_coloring).inject(erbed_text){|result, hook| hook.call(result, event)}
|
129
146
|
|
130
|
-
text = TermColor.parse(
|
131
|
-
|
132
|
-
|
133
|
-
|
147
|
+
text = TermColor.unescape(TermColor.parse(erbed_text) + "\n")
|
148
|
+
if config.plugins.stdout.show_reply_chain && s.in_reply_to_status_id
|
149
|
+
indent += 1
|
150
|
+
unless indent > config.plugins.stdout.max_indent_level
|
151
|
+
begin
|
152
|
+
status = Termtter::API.twitter.show(s.in_reply_to_status_id)
|
153
|
+
text << status_line(status, time_format, event, indent)
|
154
|
+
rescue Rubytter::APIError
|
155
|
+
end
|
156
|
+
end
|
134
157
|
end
|
135
158
|
text
|
136
159
|
end
|
160
|
+
|
161
|
+
def colorize_users(text)
|
162
|
+
text.gsub(/@(\w+)/) do |i|
|
163
|
+
user = Termtter::API.twitter.cached_user($1)
|
164
|
+
if user
|
165
|
+
color = user_color(user)
|
166
|
+
"<#{color}>#{i}</#{color}>"
|
167
|
+
else
|
168
|
+
i
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def user_color(user)
|
174
|
+
config.plugins.stdout.colors[user.id.to_i % config.plugins.stdout.colors.size]
|
175
|
+
end
|
137
176
|
end
|
138
177
|
|
139
178
|
Client.register_hook(StdOut.new)
|