termtter 1.3.1 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -8
- data/Rakefile +13 -3
- data/lib/plugins/command_plus.rb +14 -14
- data/lib/plugins/confirm.rb +10 -4
- data/lib/plugins/countter.rb +18 -18
- data/lib/plugins/db.rb +1 -1
- data/lib/plugins/defaults/alias.rb +69 -0
- data/lib/plugins/defaults/auto_reload.rb +2 -2
- data/lib/plugins/defaults/command_line.rb +9 -0
- data/lib/plugins/defaults/fib.rb +5 -23
- data/lib/plugins/defaults/retweet.rb +17 -13
- data/lib/plugins/defaults/standard_commands.rb +40 -63
- data/lib/plugins/defaults/standard_completion.rb +14 -9
- data/lib/plugins/defaults/stdout.rb +32 -19
- data/lib/plugins/defaults.rb +1 -0
- data/lib/plugins/erb.rb +4 -8
- data/lib/plugins/expand-tinyurl.rb +4 -0
- data/lib/plugins/fibyou.rb +12 -0
- data/lib/plugins/group.rb +19 -20
- data/lib/plugins/hi.rb +15 -0
- data/lib/plugins/hugeurl.rb +1 -1
- data/lib/plugins/irc_gw.rb +53 -5
- data/lib/plugins/itunes.rb +33 -0
- data/lib/plugins/jakigan.rb +30 -0
- data/lib/plugins/list_with_opts.rb +1 -1
- data/lib/plugins/multi_output.rb +34 -0
- data/lib/plugins/multi_post.rb +30 -15
- data/lib/plugins/open.rb +44 -0
- data/lib/plugins/paranoid.rb +11 -0
- data/lib/plugins/quick_exit.rb +9 -0
- data/lib/plugins/replace.rb +54 -0
- data/lib/plugins/saykanji.rb +1 -1
- data/lib/plugins/searchline.rb +44 -0
- data/lib/plugins/tinyurl.rb +7 -1
- data/lib/plugins/train.rb +24 -0
- data/lib/termtter/active_rubytter.rb +39 -0
- data/lib/termtter/api.rb +24 -21
- data/lib/termtter/client.rb +17 -29
- data/lib/termtter/config_setup.rb +27 -2
- data/lib/termtter/config_template.erb +2 -2
- data/lib/termtter/version.rb +1 -1
- data/lib/termtter.rb +9 -4
- data/spec/plugins/db_spec.rb +1 -1
- data/spec/plugins/fib_spec.rb +1 -1
- data/spec/plugins/standard_commands_spec.rb +4 -0
- data/spec/plugins/whois_spec.rb +7 -7
- data/spec/termtter/active_rubytter_spec.rb +70 -0
- metadata +29 -5
data/README.rdoc
CHANGED
@@ -37,6 +37,7 @@ Search
|
|
37
37
|
* json_pure or json
|
38
38
|
* termcolor
|
39
39
|
* rubytter
|
40
|
+
* highline
|
40
41
|
|
41
42
|
== INSTALL:
|
42
43
|
|
@@ -44,14 +45,6 @@ Search
|
|
44
45
|
|
45
46
|
== CONFIGURATION:
|
46
47
|
|
47
|
-
Termtter generates a configuration file named '~/.termtter/config'.
|
48
|
-
You can edit the file anytime.
|
49
|
-
|
50
|
-
% vim ~/.termtter/config
|
51
|
-
|
52
|
-
config.user_name = 'USERNAME'
|
53
|
-
config.password = 'PASSWORD'
|
54
|
-
|
55
48
|
If you would like to use proxy server, add configurations like this:
|
56
49
|
|
57
50
|
config.proxy.host = 'PROXYHOST'
|
data/Rakefile
CHANGED
@@ -21,11 +21,12 @@ spec = Gem::Specification.new do |s|
|
|
21
21
|
s.executables = ["kill_termtter", "termtter"]
|
22
22
|
s.add_dependency("json_pure", ">= 1.1.3")
|
23
23
|
s.add_dependency("highline", ">= 1.5.0")
|
24
|
-
s.add_dependency("termcolor", ">= 0.
|
25
|
-
s.add_dependency("rubytter", ">= 0.
|
24
|
+
s.add_dependency("termcolor", ">= 1.0.0")
|
25
|
+
s.add_dependency("rubytter", ">= 0.9.2")
|
26
|
+
s.add_dependency("oauth", ">= 0.3.6")
|
26
27
|
s.authors = %w(jugyo ujihisa)
|
27
28
|
s.email = 'jugyo.org@gmail.com'
|
28
|
-
s.homepage = 'http://
|
29
|
+
s.homepage = 'http://termtter.org/'
|
29
30
|
s.rubyforge_project = 'termtter'
|
30
31
|
s.has_rdoc = true
|
31
32
|
s.rdoc_options = ["--main", "README.rdoc", "--exclude", "spec"]
|
@@ -62,6 +63,14 @@ Spec::Rake::SpecTask.new do |t|
|
|
62
63
|
t.spec_files = FileList['spec/**/*_spec.rb']
|
63
64
|
t.spec_opts = ['-c']
|
64
65
|
end
|
66
|
+
desc "Run all examples with RCov"
|
67
|
+
|
68
|
+
Spec::Rake::SpecTask.new('rcov') do |t|
|
69
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
70
|
+
t.spec_opts = ['-c', '-fs']
|
71
|
+
t.rcov = true
|
72
|
+
t.rcov_opts = ['-x', 'spec', '--exclude', 'lib/plugins']
|
73
|
+
end
|
65
74
|
|
66
75
|
Rake::RDocTask.new do |t|
|
67
76
|
t.rdoc_dir = 'rdoc'
|
@@ -72,3 +81,4 @@ Rake::RDocTask.new do |t|
|
|
72
81
|
end
|
73
82
|
|
74
83
|
CLEAN.include [ 'pkg', 'rdoc' ]
|
84
|
+
|
data/lib/plugins/command_plus.rb
CHANGED
@@ -26,22 +26,22 @@ end
|
|
26
26
|
|
27
27
|
module Termtter::Client
|
28
28
|
register_command(
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
:name => :delete_command,
|
30
|
+
:exec_proc => lambda {|arg|
|
31
|
+
Termtter::Client.delete_command(arg)
|
32
|
+
},
|
33
|
+
:completion_proc => lambda {|cmd, arg|
|
34
|
+
},
|
35
|
+
:help => ['delete_command command', 'delete command from command list (this command is experimental!)']
|
36
36
|
)
|
37
37
|
|
38
38
|
register_command(
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
39
|
+
:name => :alias_command,
|
40
|
+
:exec_proc => lambda {|arg|
|
41
|
+
Termtter::Client.alias_command(arg)
|
42
|
+
},
|
43
|
+
:completion_proc => lambda {|cmd, arg|
|
44
|
+
},
|
45
|
+
:help => ['alias_command A B', 'alias command A to B (this command is experimental!)']
|
46
46
|
)
|
47
47
|
end
|
data/lib/plugins/confirm.rb
CHANGED
@@ -4,7 +4,7 @@ config.plugins.confirm.set_default(:commands, [:update, :reply, :direct])
|
|
4
4
|
config.plugins.confirm.set_default(
|
5
5
|
:conditions,
|
6
6
|
[
|
7
|
-
lambda {
|
7
|
+
lambda {|cmd_name, arg|
|
8
8
|
if cmd_name == :direct && arg =~ /^(list|sent_list)$/
|
9
9
|
false
|
10
10
|
else
|
@@ -18,16 +18,22 @@ Termtter::Client.register_hook(
|
|
18
18
|
:name => :confirm,
|
19
19
|
:points => [/^pre_exec_/],
|
20
20
|
:exec_proc => lambda {|cmd, arg|
|
21
|
-
if config.plugins.confirm.commands.include?(cmd.name) &&
|
21
|
+
if config.plugins.confirm.commands.include?(cmd.name) &&
|
22
22
|
config.plugins.confirm.conditions.any? { |cond| cond.call(cmd.name, arg) }
|
23
23
|
|
24
|
-
|
24
|
+
if arg.match(/^(\d+)\s+(.+)$/) and
|
25
|
+
(s = Termtter::API.twitter.show($1) rescue nil)
|
26
|
+
tmp_arg = "@#{s.user.screen_name} #{$2}"
|
27
|
+
else
|
28
|
+
tmp_arg = arg
|
29
|
+
end
|
30
|
+
|
31
|
+
prompt = "\"#{cmd.name} #{tmp_arg}".strip + "\" [Y/n] "
|
25
32
|
|
26
33
|
if /^y?$/i !~ Readline.readline(prompt, false)
|
27
34
|
puts 'canceled.'
|
28
35
|
raise Termtter::CommandCanceled
|
29
36
|
end
|
30
|
-
|
31
37
|
end
|
32
38
|
}
|
33
39
|
)
|
data/lib/plugins/countter.rb
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
module Termtter::Client
|
2
2
|
register_command(
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
3
|
+
:name => :countter,
|
4
|
+
:exec_proc => lambda {|arg|
|
5
|
+
count = {}
|
6
|
+
public_storage[:log].each do |l|
|
7
|
+
source = l.source =~ /(?:<a href=\".+?\">)(.+)(?:<\/a>)/ ? $1 : l.source
|
8
|
+
count[source] = 0 unless count[source]
|
9
|
+
count[source] += 1
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
format = "%24s %6s"
|
13
|
+
puts format % %w(sources count)
|
14
|
+
puts format % ['-'*24, '-'*6]
|
15
|
+
count.to_a.sort{|a,b|b[1]<=>a[1]}.each do |k,v|
|
16
|
+
puts format % [k, v]
|
17
|
+
end
|
18
|
+
},
|
19
|
+
:completion_proc => lambda {|cmd, arg|
|
20
|
+
},
|
21
|
+
:help => ['countter', 'count sources']
|
22
22
|
)
|
23
23
|
end
|
data/lib/plugins/db.rb
CHANGED
@@ -0,0 +1,69 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Examples:
|
4
|
+
#
|
5
|
+
# ~/termtter/config
|
6
|
+
#
|
7
|
+
# config.plugins.alias.aliases = {:ls => 'list', :hoge => 'update hoge'}
|
8
|
+
#
|
9
|
+
# command line
|
10
|
+
#
|
11
|
+
# > alias ls list
|
12
|
+
# > alias me list @jugyo
|
13
|
+
# > alias st search termtter
|
14
|
+
#
|
15
|
+
# > remove_alias ls
|
16
|
+
#
|
17
|
+
|
18
|
+
config.plugins.alias.set_default(:aliases, {})
|
19
|
+
|
20
|
+
module Termtter::Client
|
21
|
+
@aliases = config.plugins.alias.aliases
|
22
|
+
|
23
|
+
class << self
|
24
|
+
def register_alias(alias_name, command)
|
25
|
+
@aliases[alias_name.to_sym] = command.to_s
|
26
|
+
end
|
27
|
+
alias_method :alias, :register_alias
|
28
|
+
|
29
|
+
def remove_alias(alias_name)
|
30
|
+
@aliases.delete alias_name.to_sym
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
register_command(:alias,
|
35
|
+
:help => ['alias NAME COMMAND', 'Add alias for any operations']) do |text|
|
36
|
+
unless text.empty?
|
37
|
+
alias_name, command = text.split(/\s+/, 2)
|
38
|
+
next unless command
|
39
|
+
register_alias alias_name, command
|
40
|
+
puts "#{alias_name} => #{command}"
|
41
|
+
else
|
42
|
+
@aliases.keys.map{|i|i.to_s}.sort.each do |k|
|
43
|
+
puts "#{k} => #{@aliases[k.to_sym]}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
register_command(:remove_alias,
|
49
|
+
:help => ['remove_alias NAME', 'Remove alias completely']) do |target|
|
50
|
+
remove_alias target
|
51
|
+
end
|
52
|
+
|
53
|
+
register_hook :aliases, :point => :pre_command do |text|
|
54
|
+
unless text =~ /^\s*$/
|
55
|
+
command = text.scan(/\s*([^\s]*)\s*/).flatten.first
|
56
|
+
if original = @aliases[command.to_sym]
|
57
|
+
text = text.sub(command, original)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
text
|
61
|
+
end
|
62
|
+
|
63
|
+
register_hook(:aliases_completion, :point => :completion) do |input|
|
64
|
+
if /^\s*([^\s]*)$/ =~ input
|
65
|
+
command_str = $1
|
66
|
+
@aliases.keys.map{|i|i.to_s}.grep(/^#{Regexp.quote(command_str)}/i)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
module Termtter::Client
|
3
3
|
add_task(:name => :auto_reload, :interval => config.update_interval, :after => config.update_interval) do
|
4
4
|
begin
|
5
|
-
call_commands('reload')
|
5
|
+
call_commands('reload -r')
|
6
6
|
rescue Exception => e
|
7
7
|
handle_error(e)
|
8
8
|
end
|
@@ -13,7 +13,7 @@ module Termtter::Client
|
|
13
13
|
:point => :initialize,
|
14
14
|
:exec => lambda {
|
15
15
|
begin
|
16
|
-
call_commands('reload')
|
16
|
+
call_commands('reload -r')
|
17
17
|
rescue Exception => e
|
18
18
|
handle_error(e)
|
19
19
|
end
|
@@ -64,6 +64,7 @@ module Termtter
|
|
64
64
|
if Readline.respond_to?(:basic_word_break_characters=)
|
65
65
|
Readline.basic_word_break_characters= "\t\n\"\\'`><=;|&{("
|
66
66
|
end
|
67
|
+
Readline.completion_case_fold = true
|
67
68
|
Readline.completion_proc = lambda {|input|
|
68
69
|
begin
|
69
70
|
words = []
|
@@ -108,4 +109,12 @@ module Termtter
|
|
108
109
|
Client.register_hook(:finalize_command_line, :point => :exit) do
|
109
110
|
CommandLine.stop
|
110
111
|
end
|
112
|
+
|
113
|
+
Client.register_command(:vi_editing_mode) do |arg|
|
114
|
+
Readline.vi_editing_mode
|
115
|
+
end
|
116
|
+
|
117
|
+
Client.register_command(:emacs_editing_mode) do |arg|
|
118
|
+
Readline.emacs_editing_mode
|
119
|
+
end
|
111
120
|
end
|
data/lib/plugins/defaults/fib.rb
CHANGED
@@ -1,25 +1,7 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
1
|
def fib(n)i=0;j=1;n.times{j=i+i=j};i end
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
text = "fib(#{n}) = #{fib n}"
|
10
|
-
Termtter::API.twitter.update(text)
|
11
|
-
puts "=> " << text
|
12
|
-
}
|
13
|
-
)
|
14
|
-
register_command(
|
15
|
-
:name => :fibyou,
|
16
|
-
:exec_proc => lambda {|arg|
|
17
|
-
/(\w+)\s(\d+)/ =~ arg
|
18
|
-
name = normalize_as_user_name($1)
|
19
|
-
n = $2.to_i
|
20
|
-
text = "@#{name} fib(#{n}) = #{fib n}"
|
21
|
-
Termtter::API.twitter.update(text)
|
22
|
-
puts "=> " << text
|
23
|
-
}
|
24
|
-
)
|
2
|
+
Termtter::Client.register_command(:fib) do |arg|
|
3
|
+
n = arg.to_i
|
4
|
+
text = "fib(#{n}) = #{fib n}"
|
5
|
+
Termtter::API.twitter.update(text)
|
6
|
+
puts "=> " << text
|
25
7
|
end
|
@@ -13,6 +13,8 @@ module Termtter::Client
|
|
13
13
|
text = ERB.new(config.plugins.retweet.format).result(binding)
|
14
14
|
Termtter::API.twitter.update(text)
|
15
15
|
puts "=> #{text}"
|
16
|
+
|
17
|
+
return text
|
16
18
|
end
|
17
19
|
|
18
20
|
register_command(
|
@@ -21,19 +23,21 @@ module Termtter::Client
|
|
21
23
|
:help => ['retweet,rt (ID|@USER)', 'Post a retweet message'],
|
22
24
|
:exec_proc => lambda {|arg|
|
23
25
|
arg, comment = arg.split(/\s/, 2)
|
24
|
-
if public_storage[:typable_id] && s = typable_id_status(arg)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
26
|
+
txt = if public_storage[:typable_id] && s = typable_id_status(arg)
|
27
|
+
post_retweet(s, comment)
|
28
|
+
else
|
29
|
+
case arg
|
30
|
+
when /(\d+)/
|
31
|
+
post_retweet(Termtter::API.twitter.show(arg), comment)
|
32
|
+
when /@([A-Za-z0-9_]+)/
|
33
|
+
user = $1
|
34
|
+
statuses = Termtter::API.twitter.user_timeline(user)
|
35
|
+
return if statuses.empty?
|
36
|
+
post_retweet(statuses[0], comment)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
return txt
|
37
41
|
}
|
38
42
|
)
|
39
43
|
end
|
@@ -5,7 +5,7 @@ require 'set'
|
|
5
5
|
|
6
6
|
config.plugins.standard.set_default(
|
7
7
|
:limit_format,
|
8
|
-
'<<%=remaining_color%>><%=limit.remaining_hits%></<%=remaining_color%>>/<%=limit.hourly_limit%> until <%=limit.reset_time%> (<%=remaining_time%> remaining)')
|
8
|
+
'<<%=remaining_color%>><%=limit.remaining_hits%></<%=remaining_color%>>/<%=limit.hourly_limit%> until <%=Time.parse(limit.reset_time).getlocal%> (<%=remaining_time%> remaining)')
|
9
9
|
|
10
10
|
config.set_default(:easy_reply, true)
|
11
11
|
|
@@ -17,10 +17,10 @@ module Termtter::Client
|
|
17
17
|
args = @since_id ? [{:since_id => @since_id}] : []
|
18
18
|
statuses = Termtter::API.twitter.friends_timeline(*args)
|
19
19
|
unless statuses.empty?
|
20
|
-
print "\e[
|
20
|
+
print "\e[0G" + "\e[K" unless win?
|
21
21
|
@since_id = statuses[0].id
|
22
22
|
output(statuses, :update_friends_timeline)
|
23
|
-
Readline.refresh_line
|
23
|
+
Readline.refresh_line if arg =~ /\-r/
|
24
24
|
end
|
25
25
|
}
|
26
26
|
)
|
@@ -103,7 +103,8 @@ module Termtter::Client
|
|
103
103
|
register_command(
|
104
104
|
:name => :profile, :aliases => [:p],
|
105
105
|
:exec_proc => lambda {|arg|
|
106
|
-
|
106
|
+
user_name = arg.empty? ? config.user_name : arg
|
107
|
+
user = Termtter::API.twitter.user(user_name)
|
107
108
|
attrs = %w[ name screen_name url description profile_image_url location protected following
|
108
109
|
friends_count followers_count statuses_count favourites_count
|
109
110
|
id time_zone created_at utc_offset notifications
|
@@ -114,7 +115,7 @@ module Termtter::Client
|
|
114
115
|
puts "#{attr.gsub('_', ' ').rjust(label_width)}: #{value}"
|
115
116
|
end
|
116
117
|
},
|
117
|
-
:help => ["profile,p USERNAME", "Show user's profile"]
|
118
|
+
:help => ["profile,p [USERNAME]", "Show user's profile."]
|
118
119
|
)
|
119
120
|
|
120
121
|
register_command(
|
@@ -154,19 +155,29 @@ module Termtter::Client
|
|
154
155
|
:help => ["list,l [USERNAME]", "List the posts"]
|
155
156
|
)
|
156
157
|
|
158
|
+
class SearchEvent; attr_reader :query; def initialize(query); @query = query end; end
|
157
159
|
public_storage[:search_keywords] = Set.new
|
158
160
|
register_command(
|
159
161
|
:name => :search, :aliases => [:s],
|
160
162
|
:exec_proc => lambda {|arg|
|
161
163
|
statuses = Termtter::API.twitter.search(arg)
|
162
164
|
public_storage[:search_keywords] << arg
|
163
|
-
output(statuses,
|
165
|
+
output(statuses, SearchEvent.new(arg))
|
164
166
|
},
|
165
167
|
:completion_proc => lambda {|cmd, arg|
|
166
168
|
public_storage[:search_keywords].grep(/^#{Regexp.quote(arg)}/).map { |i| "#{cmd} #{i}" }
|
167
169
|
},
|
168
170
|
:help => ["search,s TEXT", "Search for Twitter"]
|
169
171
|
)
|
172
|
+
register_hook(:highlight_for_search_query, :point => :pre_coloring) do |text, event|
|
173
|
+
case event
|
174
|
+
when SearchEvent
|
175
|
+
query = event.query.split(/\s/).map {|q|Regexp.quote(q)}.join("|")
|
176
|
+
text.gsub(/(#{query})/i, '<on_magenta><white>\1</white></on_magenta>')
|
177
|
+
else
|
178
|
+
text
|
179
|
+
end
|
180
|
+
end
|
170
181
|
|
171
182
|
register_command(
|
172
183
|
:name => :replies, :aliases => [:r],
|
@@ -189,7 +200,7 @@ module Termtter::Client
|
|
189
200
|
:completion_proc => lambda {|cmd, arg|
|
190
201
|
case arg
|
191
202
|
when /(\w+):\s*(\d+)\s*$/
|
192
|
-
find_status_ids($2).map{|id| "#{cmd} #{$1}: #{id}"}
|
203
|
+
find_status_ids($2).map {|id| "#{cmd} #{$1}: #{id}"}
|
193
204
|
else
|
194
205
|
users = find_users(arg)
|
195
206
|
unless users.empty?
|
@@ -264,7 +275,7 @@ module Termtter::Client
|
|
264
275
|
:completion_proc => lambda {|cmd, arg|
|
265
276
|
case arg
|
266
277
|
when /(\d+)/
|
267
|
-
find_status_ids(arg).map{|id| "#{cmd} #{id}"}
|
278
|
+
find_status_ids(arg).map {|id| "#{cmd} #{id}"}
|
268
279
|
else
|
269
280
|
if data = Termtter::Client.typable_id_to_data(arg)
|
270
281
|
"#{cmd} #{data}"
|
@@ -369,7 +380,7 @@ module Termtter::Client
|
|
369
380
|
:alias => :plugin,
|
370
381
|
:exec_proc => lambda {|arg|
|
371
382
|
if arg.empty?
|
372
|
-
|
383
|
+
plugin_list
|
373
384
|
return
|
374
385
|
end
|
375
386
|
begin
|
@@ -380,44 +391,39 @@ module Termtter::Client
|
|
380
391
|
end
|
381
392
|
},
|
382
393
|
:completion_proc => lambda {|cmd, args|
|
383
|
-
plugin_list.grep(/^#{Regexp.quote(args)}/).map{|i| "#{cmd} #{i}"}
|
394
|
+
plugin_list.grep(/^#{Regexp.quote(args)}/).map {|i| "#{cmd} #{i}"}
|
384
395
|
},
|
385
396
|
:help => ['plug FILE', 'Load a plugin']
|
386
397
|
)
|
387
398
|
|
399
|
+
## plugin_list :: IO ()
|
388
400
|
def self.plugin_list
|
389
|
-
(Dir["#{File.dirname(__FILE__)}/../*.rb"] + Dir["#{Termtter::CONF_DIR}/plugins/*.rb"]).
|
390
|
-
map{|f| File.basename(f).sub(/\.rb$/, '')}.
|
401
|
+
plugin_list = (Dir["#{File.dirname(__FILE__)}/../*.rb"] + Dir["#{Termtter::CONF_DIR}/plugins/*.rb"]).
|
402
|
+
map {|f| File.basename(f).sub(/\.rb$/, '')}.
|
391
403
|
sort
|
404
|
+
list = plugin_list
|
405
|
+
width = list.map {|i|i.size}.max + 2
|
406
|
+
a = []
|
407
|
+
list.sort.each_slice(4) {|i|
|
408
|
+
a << i.map {|j| j + (" " * (width - j.size))}.join
|
409
|
+
}
|
410
|
+
puts TermColor.parse('<green>' + TermColor.escape(a.join("\n")) + '</green>')
|
392
411
|
end
|
393
412
|
|
394
|
-
register_command(
|
395
|
-
:name => :plugins,
|
396
|
-
:exec_proc => lambda {|arg|
|
397
|
-
list = plugin_list
|
398
|
-
width = list.map{|i|i.size}.max + 2
|
399
|
-
a = []
|
400
|
-
list.sort.each_slice(4) {|i|
|
401
|
-
a << i.map{|j| j + (" " * (width - j.size))}.join
|
402
|
-
}
|
403
|
-
puts TermColor.parse('<green>' + TermColor.escape(a.join("\n")) + '</green>')
|
404
|
-
},
|
405
|
-
:help => ['plugins', 'Show list of plugins']
|
406
|
-
)
|
407
|
-
|
408
413
|
register_command(
|
409
414
|
:name => :reply,
|
410
415
|
:aliases => [:re],
|
411
416
|
:exec_proc => lambda {|arg|
|
412
417
|
case arg
|
413
418
|
when /^\s*(?:list|ls)\s*(?:\s+(\w+))?\s*$/
|
414
|
-
public_storage[:log4re] =
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
419
|
+
public_storage[:log4re] =
|
420
|
+
if $1
|
421
|
+
public_storage[:log].
|
422
|
+
select {|l| l.user.screen_name == $1}.
|
423
|
+
sort {|a,b| a.id <=> b.id}
|
424
|
+
else
|
425
|
+
public_storage[:log].sort {|a,b| a.id <=> b.id}
|
426
|
+
end
|
421
427
|
public_storage[:log4re].each_with_index do |s, i|
|
422
428
|
puts "#{i}: #{s.user.screen_name}: #{s.text}"
|
423
429
|
end
|
@@ -445,7 +451,7 @@ module Termtter::Client
|
|
445
451
|
:completion_proc => lambda {|cmd, arg|
|
446
452
|
case arg
|
447
453
|
when /(\d+)/
|
448
|
-
find_status_ids(arg).map{|id| "#{cmd} #{id}"}
|
454
|
+
find_status_ids(arg).map {|id| "#{cmd} #{id}"}
|
449
455
|
end
|
450
456
|
},
|
451
457
|
:help => ["reply,re @USERNAME or STATUS_ID", "Send a reply"]
|
@@ -475,35 +481,6 @@ module Termtter::Client
|
|
475
481
|
:help => ["redo,.", "Execute previous command"]
|
476
482
|
)
|
477
483
|
|
478
|
-
register_command(:alias,
|
479
|
-
:help => ['alias NAME VALUE', 'Add alias for any operations']) do |text|
|
480
|
-
from, to = text.split(' ', 2)
|
481
|
-
next unless to
|
482
|
-
begin
|
483
|
-
add_alias from, to
|
484
|
-
rescue
|
485
|
-
STDOUT.print 'override? [y/n] '
|
486
|
-
STDOUT.flush
|
487
|
-
next unless /y/ =~ STDIN.gets.chomp
|
488
|
-
add_alias from, to, false
|
489
|
-
end
|
490
|
-
puts "#{from} => #{to}"
|
491
|
-
end
|
492
|
-
|
493
|
-
register_command(:remove_alias,
|
494
|
-
:help => ['remove_alias NAME', 'Remove alias completely']) do |target|
|
495
|
-
remove_alias target
|
496
|
-
STDOUT.puts 'done'
|
497
|
-
end
|
498
|
-
|
499
|
-
register_hook :aliases, :point => :pre_command do |text|
|
500
|
-
command, args = text.split(' ', 2)
|
501
|
-
if original = @aliases[command]
|
502
|
-
text = [original, args].compact.join(' ')
|
503
|
-
end
|
504
|
-
text
|
505
|
-
end
|
506
|
-
|
507
484
|
def self.update_with_user_and_id(text, username, id)
|
508
485
|
text = "@#{username} #{text}"
|
509
486
|
result = Termtter::API.twitter.update(text, {'in_reply_to_status_id' => id})
|
@@ -32,9 +32,9 @@ module Termtter::Client
|
|
32
32
|
end
|
33
33
|
|
34
34
|
register_hook(:user_names_completion, :point => :completion) do |input|
|
35
|
-
if /(.*)
|
35
|
+
if /(.*)\s([^\s]*)$/ =~ input
|
36
36
|
command_str = $1
|
37
|
-
part_of_user_name = $2
|
37
|
+
part_of_user_name = $2.gsub(/^@/, '')
|
38
38
|
|
39
39
|
users =
|
40
40
|
if part_of_user_name.nil? || part_of_user_name.empty?
|
@@ -43,7 +43,7 @@ module Termtter::Client
|
|
43
43
|
public_storage[:users].grep(/^#{Regexp.quote(part_of_user_name)}/i)
|
44
44
|
end
|
45
45
|
|
46
|
-
users.map {|u| "#{command_str}@%s" % u }
|
46
|
+
users.map {|u| "#{command_str} @%s" % u }
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
@@ -51,17 +51,22 @@ module Termtter::Client
|
|
51
51
|
# completion for hashtags
|
52
52
|
#
|
53
53
|
|
54
|
-
public_storage[:
|
54
|
+
public_storage[:hashtags] ||= Set.new
|
55
55
|
|
56
|
-
register_hook(:collect_hashtags, :point =>
|
57
|
-
|
56
|
+
register_hook(:collect_hashtags, :point => :pre_filter) do |statuses, event|
|
57
|
+
statuses.each do |s|
|
58
|
+
public_storage[:hashtags] += s.text.scan(/#([^\s]+)/).flatten
|
59
|
+
end
|
58
60
|
end
|
59
61
|
|
60
|
-
register_hook(:
|
61
|
-
if /(.*)#([^\s]*)$/ =~ input
|
62
|
+
register_hook(:hashtagss_completion, :point => :completion) do |input|
|
63
|
+
if /(.*)\s#([^\s]*)$/ =~ input
|
62
64
|
command_str = $1
|
63
65
|
part_of_hashtag = $2
|
64
|
-
public_storage[:
|
66
|
+
ht = public_storage[:hashtags]
|
67
|
+
(ht.grep(/^#{Regexp.quote(part_of_hashtag)}/) | # prior
|
68
|
+
ht.grep(/^#{Regexp.quote(part_of_hashtag)}/i) ).
|
69
|
+
map { |i| "#{command_str} ##{i}" }
|
65
70
|
end
|
66
71
|
end
|
67
72
|
end
|