termtter 1.3.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|