jugyo-termtter 0.8.14 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +8 -8
- data/Rakefile +3 -5
- data/lib/{plugin → plugins}/april_fool.rb +0 -0
- data/lib/plugins/bomb.rb +42 -0
- data/lib/{plugin → plugins}/clear.rb +0 -0
- data/lib/{plugin → plugins}/confirm.rb +0 -0
- data/lib/{plugin → plugins}/cool.rb +0 -0
- data/lib/{plugin → plugins}/devel.rb +0 -0
- data/lib/{filter → plugins}/en2ja.rb +1 -1
- data/lib/plugins/english.rb +25 -0
- data/lib/{plugin → plugins}/erb.rb +0 -0
- data/lib/{filter → plugins}/expand-tinyurl.rb +6 -6
- data/lib/plugins/favorite.rb +63 -0
- data/lib/plugins/fib.rb +28 -0
- data/lib/{filter/fib.rb → plugins/fib_filter.rb} +1 -2
- data/lib/{plugin → plugins}/filter.rb +0 -0
- data/lib/{plugin → plugins}/graduatter.rb +1 -2
- data/lib/{plugin → plugins}/grass.rb +2 -2
- data/lib/{plugin → plugins}/group.rb +9 -9
- data/lib/{plugin → plugins}/growl.rb +11 -12
- data/lib/{plugin → plugins}/hatebu.rb +5 -5
- data/lib/{plugin → plugins}/history.rb +13 -13
- data/lib/plugins/ignore.rb +19 -0
- data/lib/plugins/keyword.rb +18 -0
- data/lib/{plugin → plugins}/log.rb +18 -12
- data/lib/{plugin → plugins}/me.rb +1 -2
- data/lib/{plugin → plugins}/modify_arg_hook_sample.rb +0 -0
- data/lib/{plugin → plugins}/msagent.rb +1 -1
- data/lib/plugins/multi_reply.rb +27 -0
- data/lib/{plugin → plugins}/notify-send.rb +1 -1
- data/lib/{plugin → plugins}/otsune.rb +0 -0
- data/lib/plugins/outputz.rb +33 -0
- data/lib/{plugin → plugins}/pause.rb +0 -0
- data/lib/{plugin → plugins}/plugin.rb +0 -0
- data/lib/{plugin → plugins}/post_exec_hook_sample.rb +0 -0
- data/lib/{plugin → plugins}/pre_exec_hook_sample.rb +0 -0
- data/lib/{plugin → plugins}/primes.rb +9 -2
- data/lib/plugins/quicklook.rb +41 -0
- data/lib/{plugin → plugins}/random.rb +0 -0
- data/lib/{plugin → plugins}/reblog.rb +3 -3
- data/lib/{plugin → plugins}/reload.rb +0 -0
- data/lib/{filter → plugins}/reply.rb +0 -0
- data/lib/{filter → plugins}/reverse.rb +1 -1
- data/lib/{plugin → plugins}/say.rb +1 -1
- data/lib/{plugin → plugins}/scrape.rb +4 -4
- data/lib/plugins/screen-notify.rb +13 -0
- data/lib/plugins/screen.rb +24 -0
- data/lib/{plugin → plugins}/shell.rb +0 -0
- data/lib/{plugin → plugins}/sl.rb +4 -4
- data/lib/plugins/spam.rb +13 -0
- data/lib/{plugin → plugins}/standard_plugins.rb +72 -18
- data/lib/plugins/stdout.rb +80 -0
- data/lib/plugins/storage/DB.rb +37 -0
- data/lib/plugins/storage/status.rb +48 -0
- data/lib/plugins/storage/status_mook.rb +30 -0
- data/lib/plugins/storage.rb +47 -0
- data/lib/plugins/system_status.rb +33 -0
- data/lib/{plugin → plugins}/translation.rb +15 -5
- data/lib/{plugin → plugins}/update_editor.rb +6 -6
- data/lib/plugins/uri-open.rb +64 -0
- data/lib/{filter → plugins}/url_addspace.rb +0 -0
- data/lib/{plugin → plugins}/wassr_post.rb +1 -1
- data/lib/{plugin → plugins}/yhara.rb +1 -1
- data/lib/plugins/yhara_filter.rb +8 -0
- data/lib/plugins/yonda.rb +21 -0
- data/lib/termtter/api.rb +28 -2
- data/lib/termtter/client.rb +90 -102
- data/lib/termtter/command.rb +32 -31
- data/lib/termtter/config.rb +64 -0
- data/lib/termtter/connection.rb +9 -7
- data/lib/termtter/hook.rb +11 -2
- data/lib/termtter/optparse.rb +14 -0
- data/lib/termtter/version.rb +1 -1
- data/lib/termtter.rb +19 -22
- data/spec/plugin/english_spec.rb +19 -0
- data/spec/plugin/favorite_spec.rb +10 -0
- data/spec/plugin/fib_spec.rb +1 -2
- data/spec/plugin/pause_spec.rb +8 -0
- data/spec/plugin/plugin_spec.rb +1 -1
- data/spec/plugin/primes_spec.rb +15 -0
- data/spec/plugin/sl_spec.rb +8 -0
- data/spec/plugin/spam_spec.rb +0 -13
- data/spec/plugin/standard_plugins_spec.rb +0 -7
- data/spec/plugin/storage/DB_spec.rb +12 -0
- data/spec/plugin/storage/status_spec.rb +24 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/termtter/client_spec.rb +63 -1
- data/spec/termtter/command_spec.rb +6 -68
- data/spec/termtter/config_spec.rb +111 -0
- data/spec/termtter/hook_spec.rb +69 -0
- data/spec/termtter_spec.rb +22 -34
- metadata +81 -72
- data/lib/filter/english.rb +0 -8
- data/lib/filter/ignore.rb +0 -19
- data/lib/filter/yhara.rb +0 -20
- data/lib/plugin/bomb.rb +0 -29
- data/lib/plugin/english.rb +0 -59
- data/lib/plugin/favorite.rb +0 -75
- data/lib/plugin/fib.rb +0 -8
- data/lib/plugin/follow.rb +0 -60
- data/lib/plugin/keyword.rb +0 -18
- data/lib/plugin/multi_reply.rb +0 -36
- data/lib/plugin/outputz.rb +0 -35
- data/lib/plugin/quicklook.rb +0 -38
- data/lib/plugin/screen.rb +0 -24
- data/lib/plugin/spam.rb +0 -9
- data/lib/plugin/stdout.rb +0 -63
- data/lib/plugin/system_status.rb +0 -33
- data/lib/plugin/uri-open.rb +0 -69
- data/lib/plugin/yonda.rb +0 -20
- data/lib/termtter/status.rb +0 -26
- data/lib/termtter/twitter.rb +0 -188
- data/lib/termtter/user.rb +0 -13
- data/spec/termtter/user_spec.rb +0 -27
- data/test/test_termtter.rb +0 -86
@@ -0,0 +1,47 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'pp'
|
4
|
+
require 'time'
|
5
|
+
|
6
|
+
require File.dirname(__FILE__) + '/storage/status'
|
7
|
+
|
8
|
+
module Termtter::Client
|
9
|
+
public_storage[:log] = []
|
10
|
+
|
11
|
+
add_hook do |statuses, event|
|
12
|
+
case event
|
13
|
+
when :pre_filter
|
14
|
+
statuses.each do |s|
|
15
|
+
Termtter::Storage::Status.insert(
|
16
|
+
:post_id => s.id,
|
17
|
+
:created_at => Time.parse(s.created_at).to_i,
|
18
|
+
:in_reply_to_status_id => s.in_reply_to_status_id,
|
19
|
+
:in_reply_to_user_id => s.in_reply_to_user_id,
|
20
|
+
:post_text => s.text,
|
21
|
+
:user_id => s.user.id,
|
22
|
+
:screen_name => s.user.screen_name)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
register_command(
|
28
|
+
:name => :search_storage, :aliases => [:ss],
|
29
|
+
:exec_proc => lambda {|arg|
|
30
|
+
unless arg.strip.empty?
|
31
|
+
key = arg.strip
|
32
|
+
Termtter::Storage::Status.search({ :post_text => key})
|
33
|
+
=begin
|
34
|
+
statuses = public_storage[:storage].search({ :post_text => key})
|
35
|
+
|
36
|
+
statuses.each do |s|
|
37
|
+
p s
|
38
|
+
end
|
39
|
+
call_hooks(statuses, :search)
|
40
|
+
=end
|
41
|
+
end
|
42
|
+
|
43
|
+
},
|
44
|
+
|
45
|
+
:help => [ 'search_storage WORD', 'Search storage for WORD' ]
|
46
|
+
)
|
47
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'erb'
|
4
|
+
|
5
|
+
config.plugins.system_status.set_default(:default_status_proc, lambda { Time.now.strftime("%x %X") })
|
6
|
+
config.plugins.system_status.set_default(:interval, 1)
|
7
|
+
config.plugins.system_status.set_default(:default_color, :on_blue)
|
8
|
+
config.plugins.system_status.set_default(:format, '<%= status %>')
|
9
|
+
|
10
|
+
def out_put_status(status, color)
|
11
|
+
formatted_status = ERB.new(config.plugins.system_status.format).result(binding)
|
12
|
+
colored_status = color(formatted_status, color)
|
13
|
+
print "\e[s\e[1000G\e[#{status.size - 1}D#{colored_status}\e[u"
|
14
|
+
$stdout.flush
|
15
|
+
end
|
16
|
+
|
17
|
+
module Termtter::Client
|
18
|
+
add_task(:name => :system_status, :interval => config.plugins.system_status.interval) do
|
19
|
+
status = (@@task_manager.get_task(:update_timeline).exec_at - Time.now).to_i.to_s
|
20
|
+
color = public_storage[:system_status_color] ||
|
21
|
+
config.plugins.system_status.default_color
|
22
|
+
out_put_status(status, color)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# system_status.rb
|
27
|
+
# show system status on left side.
|
28
|
+
# output public_storage[:system_status] or Time.now.strftime("%x %X") if nil
|
29
|
+
# example config
|
30
|
+
# config.plugins.system_status.default_status_proc = lambda { Time.now.strftime("%x %X") }
|
31
|
+
# config.plugins.system_status.interval = 1
|
32
|
+
# config.plugins.system_status.default_color = :on_blue
|
33
|
+
# config.plugins.system_status.format = '<%= status %>'
|
@@ -17,11 +17,21 @@ def translate(text, langpair)
|
|
17
17
|
}
|
18
18
|
end
|
19
19
|
|
20
|
-
Termtter::Client.
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
Termtter::Client.register_command(
|
21
|
+
:name => :en2ja,
|
22
|
+
:exec_proc => lambda{|arg|
|
23
|
+
puts "translating..."
|
24
|
+
puts "=> #{translate(arg, 'en|ja')}"
|
25
|
+
}
|
26
|
+
)
|
27
|
+
|
28
|
+
Termtter::Client.register_command(
|
29
|
+
:name => :ja2en,
|
30
|
+
:exec_proc => lambda{|arg|
|
31
|
+
puts "translating..."
|
32
|
+
puts "=> #{translate(arg, 'ja|en')}"
|
33
|
+
}
|
34
|
+
)
|
25
35
|
|
26
36
|
# This plugin does not work yet.
|
27
37
|
# requirements
|
@@ -4,17 +4,17 @@ require 'tempfile'
|
|
4
4
|
|
5
5
|
module Termtter::Client
|
6
6
|
if ENV['EDITOR']
|
7
|
-
|
7
|
+
config.plugins.update_editor.set_default('editor', ENV['EDITOR'])
|
8
8
|
else
|
9
|
-
|
9
|
+
config.plugins.update_editor.set_default('editor', 'vi')
|
10
10
|
end
|
11
|
-
|
11
|
+
config.plugins.update_editor.set_default('add_completion', false)
|
12
12
|
|
13
13
|
|
14
14
|
def self.input_editor
|
15
15
|
file = Tempfile.new('termtter')
|
16
|
-
editor =
|
17
|
-
if
|
16
|
+
editor = config.plugins.update_editor.editor
|
17
|
+
if config.plugins.update_editor.add_completion
|
18
18
|
file.puts "\n"*100 + "__END__\n" + public_storage[:users].to_a.join(' ')
|
19
19
|
end
|
20
20
|
file.close
|
@@ -34,7 +34,7 @@ module Termtter::Client
|
|
34
34
|
text.split("\n").each do |post|
|
35
35
|
break if post =~ /^__END__$/
|
36
36
|
unless post.empty?
|
37
|
-
Termtter::API.twitter.
|
37
|
+
Termtter::API.twitter.update(post)
|
38
38
|
puts "=> #{post}"
|
39
39
|
end
|
40
40
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Termtter::Client
|
4
|
+
public_storage[:uris] = []
|
5
|
+
|
6
|
+
add_hook do |statuses, event, t|
|
7
|
+
if event == :update_friends_timeline
|
8
|
+
statuses.each do |s|
|
9
|
+
public_storage[:uris] += s.text.scan(%r|https?://[^\s]+|)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.open_uri(uri)
|
15
|
+
unless config.plugins.uri_open.browser.empty?
|
16
|
+
system config.plugins.uri_open.browser, uri
|
17
|
+
else
|
18
|
+
case RUBY_PLATFORM
|
19
|
+
when /linux/
|
20
|
+
system 'firefox', uri
|
21
|
+
when /mswin(?!ce)|mingw|bccwin/
|
22
|
+
system 'explorer', uri
|
23
|
+
else
|
24
|
+
system 'open', uri
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
register_command(
|
30
|
+
:name => :'uri-open', :aliases => [:uo],
|
31
|
+
:exec_proc => lambda{|arg|
|
32
|
+
case arg
|
33
|
+
when /^\s+$/
|
34
|
+
public_storage[:uris].each do |uri|
|
35
|
+
open_uri(uri)
|
36
|
+
end
|
37
|
+
public_storage[:uris].clear
|
38
|
+
when /^\s*list\s*$/
|
39
|
+
public_storage[:uris].each_with_index do |uri, index|
|
40
|
+
puts "#{index}: #{uri}"
|
41
|
+
end
|
42
|
+
when /^\s*delete\s+(\d+)\s*$/
|
43
|
+
puts 'delete'
|
44
|
+
public_storage[:uris].delete_at($1.to_i)
|
45
|
+
when /^\s*clear\s*$/
|
46
|
+
public_storage[:uris].clear
|
47
|
+
puts "clear uris"
|
48
|
+
when /^\s*(\d+)\s*$/
|
49
|
+
open_uri(public_storage[:uris][$1.to_i])
|
50
|
+
public_storage[:uris].delete_at($1.to_i)
|
51
|
+
end
|
52
|
+
},
|
53
|
+
:completion_proc => lambda{|cmd, arg|
|
54
|
+
%w(list delete clear).grep(/^#{Regexp.quote arg}/).map{|a| "#{cmd} #{a}"}
|
55
|
+
}
|
56
|
+
)
|
57
|
+
end
|
58
|
+
# ~/.termtter
|
59
|
+
# plugin 'uri-open'
|
60
|
+
#
|
61
|
+
# see also: http://ujihisa.nowa.jp/entry/c3dd00c4e0
|
62
|
+
#
|
63
|
+
# KNOWN BUG
|
64
|
+
# * In Debian, exit or C-c in the termtter kills your firefox.
|
File without changes
|
@@ -10,7 +10,7 @@ Termtter::Client.register_hook(
|
|
10
10
|
begin
|
11
11
|
Net::HTTP.version_1_2
|
12
12
|
req = Net::HTTP::Post.new("/statuses/update.json?")
|
13
|
-
req.basic_auth
|
13
|
+
req.basic_auth config.plugins.wassr_post.username, config.plugins.wassr_post.password
|
14
14
|
Net::HTTP.start('api.wassr.jp', 80) do |http|
|
15
15
|
res = http.request(req, "status=#{URI.escape(arg.strip)}&source=Termtter")
|
16
16
|
end
|
@@ -129,7 +129,7 @@ module Termtter::Client
|
|
129
129
|
:name => :yhara,
|
130
130
|
:exec_proc => lambda{|arg|
|
131
131
|
text = "#{'@' if arg[0..0] != '@'}#{arg} #{Yharian::text}"
|
132
|
-
Termtter::API.twitter.
|
132
|
+
Termtter::API.twitter.update(text)
|
133
133
|
puts "=> #{text}"
|
134
134
|
},
|
135
135
|
:completion_proc => lambda {|cmd, args|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Termtter::Client
|
4
|
+
register_command(:name => :yonda,
|
5
|
+
:aliases => [:y],
|
6
|
+
:exec_proc => lambda { |arg|
|
7
|
+
public_storage[:unread_count] = 0
|
8
|
+
print "\033[2J\033[H" # FIXME
|
9
|
+
true
|
10
|
+
},
|
11
|
+
:help => ['yonda,y', 'Mark as read']
|
12
|
+
)
|
13
|
+
|
14
|
+
register_hook(:name => :yonda,
|
15
|
+
:points => [:post_exec__update_timeline],
|
16
|
+
:exec_proc => lambda { |cmd, arg, result|
|
17
|
+
public_storage[:unread_count] ||= 0
|
18
|
+
public_storage[:unread_count] += result.size
|
19
|
+
}
|
20
|
+
)
|
21
|
+
end
|
data/lib/termtter/api.rb
CHANGED
@@ -1,12 +1,38 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
require 'rubytter'
|
3
|
+
|
4
|
+
config.set_default(:host, 'twitter.com')
|
5
|
+
config.proxy.set_default(:port, '8080')
|
6
|
+
config.proxy.set_default(:host, nil)
|
7
|
+
config.proxy.set_default(:port, nil)
|
8
|
+
config.proxy.set_default(:user_name, nil)
|
9
|
+
config.proxy.set_default(:password, nil)
|
10
|
+
config.set_default(:enable_ssl, false)
|
2
11
|
|
3
12
|
module Termtter
|
4
13
|
module API
|
5
14
|
class << self
|
6
|
-
attr_reader :connection, :twitter
|
15
|
+
attr_reader :connection, :twitter, :twitter_old
|
7
16
|
def setup
|
8
17
|
@connection = Connection.new
|
9
|
-
@twitter =
|
18
|
+
@twitter = Rubytter.new(
|
19
|
+
config.user_name,
|
20
|
+
config.password,
|
21
|
+
{
|
22
|
+
:host => config.host,
|
23
|
+
:header => {
|
24
|
+
'User-Agent' => 'Termtter http://github.com/jugyo/termtter',
|
25
|
+
'X-Twitter-Client' => 'Termtter',
|
26
|
+
'X-Twitter-Client-URL' => 'http://github.com/jugyo/termtter',
|
27
|
+
'X-Twitter-Client-Version' => '0.1'
|
28
|
+
},
|
29
|
+
:enable_ssl => config.enable_ssl,
|
30
|
+
:proxy_host => config.proxy.host,
|
31
|
+
:proxy_port => config.proxy.port,
|
32
|
+
:proxy_user_name => config.proxy.user_name,
|
33
|
+
:proxy_password => config.proxy.password
|
34
|
+
}
|
35
|
+
)
|
10
36
|
end
|
11
37
|
end
|
12
38
|
end
|
data/lib/termtter/client.rb
CHANGED
@@ -10,20 +10,16 @@ module Termtter
|
|
10
10
|
def init
|
11
11
|
@@hooks = []
|
12
12
|
@@new_hooks = {}
|
13
|
-
@@commands = {}
|
14
13
|
@@new_commands = {}
|
15
14
|
@@completions = []
|
16
15
|
@@filters = []
|
17
16
|
@@helps = []
|
18
17
|
@@since_id = nil
|
19
|
-
@@main_thread = nil
|
20
18
|
@@input_thread = nil
|
21
19
|
@@task_manager = Termtter::TaskManager.new
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
configatron.proxy.set_default(:port, '8080')
|
26
|
-
configatron.set_default(:devel, false)
|
20
|
+
config.set_default(:update_interval, 300)
|
21
|
+
config.set_default(:prompt, '> ')
|
22
|
+
config.set_default(:devel, false)
|
27
23
|
Thread.abort_on_exception = true
|
28
24
|
end
|
29
25
|
|
@@ -39,13 +35,6 @@ module Termtter
|
|
39
35
|
EOF
|
40
36
|
end
|
41
37
|
|
42
|
-
# Deprecated
|
43
|
-
# FIXME: delete when become unnecessary
|
44
|
-
def add_command(regex, &block)
|
45
|
-
warn "Termtter:Client.add_command method will be removed. Use Termtter::Client.register_command() instead. (#{caller.first})"
|
46
|
-
@@commands[regex] = block
|
47
|
-
end
|
48
|
-
|
49
38
|
def register_hook(arg)
|
50
39
|
hook = case arg
|
51
40
|
when Hook
|
@@ -96,7 +85,7 @@ module Termtter
|
|
96
85
|
@@helps << [name, desc]
|
97
86
|
end
|
98
87
|
|
99
|
-
%w[hooks
|
88
|
+
%w[hooks completions helps filters].each do |n|
|
100
89
|
eval <<-EOF
|
101
90
|
def clear_#{n}
|
102
91
|
@@#{n}.clear
|
@@ -105,15 +94,27 @@ module Termtter
|
|
105
94
|
end
|
106
95
|
|
107
96
|
# memo: each filter must return Array of Status
|
108
|
-
def apply_filters(
|
109
|
-
|
110
|
-
|
111
|
-
|
97
|
+
def apply_filters(result, event = nil)
|
98
|
+
case event
|
99
|
+
when :show
|
100
|
+
result
|
101
|
+
when :search
|
102
|
+
filtered = result.results.map(&:dup)
|
103
|
+
@@filters.each do |f|
|
104
|
+
filtered = f.call(filtered, event)
|
105
|
+
end
|
106
|
+
result.results = filtered
|
107
|
+
result
|
108
|
+
else
|
109
|
+
filtered = result.map(&:dup)
|
110
|
+
@@filters.each do |f|
|
111
|
+
filtered = f.call(filtered, event)
|
112
|
+
end
|
113
|
+
filtered
|
112
114
|
end
|
113
|
-
filtered
|
114
115
|
rescue => e
|
115
116
|
handle_error(e)
|
116
|
-
|
117
|
+
result
|
117
118
|
end
|
118
119
|
|
119
120
|
def do_hooks(statuses, event)
|
@@ -133,7 +134,7 @@ module Termtter
|
|
133
134
|
break if result == false # interrupt if hook return false
|
134
135
|
result = hook.exec_proc.call(*args)
|
135
136
|
}
|
136
|
-
|
137
|
+
result
|
137
138
|
rescue => e
|
138
139
|
if point.to_sym == :on_error
|
139
140
|
raise
|
@@ -145,44 +146,40 @@ module Termtter
|
|
145
146
|
# TODO: delete argument "tw" when unnecessary
|
146
147
|
def call_hooks(statuses, event, tw = nil)
|
147
148
|
do_hooks(statuses, :pre_filter)
|
148
|
-
|
149
|
+
filtered = apply_filters(statuses, event)
|
150
|
+
do_hooks(filtered, :post_filter)
|
151
|
+
do_hooks(filtered, event)
|
149
152
|
end
|
150
153
|
|
151
154
|
def call_commands(text, tw = nil)
|
152
155
|
return if text.empty?
|
153
156
|
|
154
157
|
command_found = false
|
155
|
-
@@commands.each do |key, command|
|
156
|
-
if key =~ text
|
157
|
-
command_found = true
|
158
|
-
@@task_manager.invoke_and_wait do
|
159
|
-
command.call($~, Termtter::API.twitter)
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
158
|
@@new_commands.each do |key, command|
|
165
|
-
|
166
|
-
if
|
159
|
+
command_str, command_arg = command.match?(text)
|
160
|
+
if command_str
|
167
161
|
command_found = true
|
168
|
-
input_command, arg = *command_info
|
169
162
|
|
170
|
-
modified_arg = call_new_hooks(
|
163
|
+
modified_arg = call_new_hooks(
|
164
|
+
"modify_arg_for_#{command.name.to_s}",
|
165
|
+
command_str,
|
166
|
+
command_arg) || command_arg || ''
|
171
167
|
|
172
168
|
@@task_manager.invoke_and_wait do
|
173
|
-
pre_exec_hook_result = call_new_hooks("pre_exec_#{command.name.to_s}", input_command, modified_arg)
|
174
|
-
next if pre_exec_hook_result == false
|
175
169
|
|
170
|
+
pre_exec_hook_result = call_new_hooks("pre_exec_#{command.name.to_s}", command_str, modified_arg)
|
171
|
+
next if pre_exec_hook_result == false
|
176
172
|
# exec command
|
177
173
|
result = command.execute(modified_arg)
|
178
174
|
if result
|
179
|
-
call_new_hooks("post_exec_#{command.name.to_s}",
|
175
|
+
call_new_hooks("post_exec_#{command.name.to_s}", command_str, modified_arg, result)
|
180
176
|
end
|
177
|
+
|
181
178
|
end
|
182
179
|
end
|
183
180
|
end
|
184
181
|
|
185
|
-
raise CommandNotFound unless command_found
|
182
|
+
raise CommandNotFound, text unless command_found
|
186
183
|
end
|
187
184
|
|
188
185
|
def pause
|
@@ -203,7 +200,6 @@ module Termtter
|
|
203
200
|
call_hooks([], :exit)
|
204
201
|
call_new_hooks(:exit)
|
205
202
|
@@task_manager.kill
|
206
|
-
@@main_thread.kill if @@main_thread
|
207
203
|
@@input_thread.kill if @@input_thread
|
208
204
|
end
|
209
205
|
|
@@ -213,20 +209,19 @@ module Termtter
|
|
213
209
|
end
|
214
210
|
|
215
211
|
def load_config
|
216
|
-
|
217
|
-
if File.exist?
|
218
|
-
|
219
|
-
load conf_file
|
220
|
-
end
|
212
|
+
legacy_config_support() if File.exist? Termtter::CONF_DIR
|
213
|
+
if File.exist? Termtter::CONF_FILE
|
214
|
+
load Termtter::CONF_FILE
|
221
215
|
else
|
222
216
|
ui = create_highline
|
223
217
|
username = ui.ask('your twitter username: ')
|
224
218
|
password = ui.ask('your twitter password: ') { |q| q.echo = false }
|
225
219
|
|
226
|
-
|
220
|
+
Dir.mkdir(Termtter::CONF_DIR)
|
221
|
+
File.open(Termtter::CONF_FILE, 'w') {|io|
|
227
222
|
io.puts '# -*- coding: utf-8 -*-'
|
228
223
|
|
229
|
-
plugins = Dir.glob(File.dirname(__FILE__) + "/../lib/
|
224
|
+
plugins = Dir.glob(File.dirname(__FILE__) + "/../lib/plugins/*.rb").map {|f|
|
230
225
|
f.match(%r|lib/plugin/(.*?).rb$|)[1]
|
231
226
|
}
|
232
227
|
plugins -= %w[stdout standard_plugins]
|
@@ -235,26 +230,43 @@ module Termtter
|
|
235
230
|
end
|
236
231
|
|
237
232
|
io.puts
|
238
|
-
io.puts "
|
239
|
-
io.puts "
|
240
|
-
io.puts "#
|
241
|
-
io.puts "#
|
242
|
-
io.puts "#
|
243
|
-
io.puts "#
|
244
|
-
io.puts "#
|
233
|
+
io.puts "config.user_name = '#{username}'"
|
234
|
+
io.puts "config.password = '#{password}'"
|
235
|
+
io.puts "#config.update_interval = 120"
|
236
|
+
io.puts "#config.proxy.host = 'proxy host'"
|
237
|
+
io.puts "#config.proxy.port = '8080'"
|
238
|
+
io.puts "#config.proxy.user_name = 'proxy user'"
|
239
|
+
io.puts "#config.proxy.password = 'proxy password'"
|
245
240
|
io.puts
|
246
241
|
io.puts "# vim: set filetype=ruby"
|
247
242
|
}
|
248
|
-
puts "generated: ~/.termtter"
|
243
|
+
puts "generated: ~/.termtter/config"
|
249
244
|
puts "enjoy!"
|
250
|
-
|
251
|
-
load conf_file
|
252
|
-
end
|
245
|
+
load Termtter::CONF_FILE
|
253
246
|
end
|
254
247
|
end
|
255
248
|
|
249
|
+
def legacy_config_support
|
250
|
+
case File.ftype(File.expand_path('~/.termtter'))
|
251
|
+
when 'directory'
|
252
|
+
# nop
|
253
|
+
when 'file'
|
254
|
+
move_legacy_config_file
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
def move_legacy_config_file
|
259
|
+
FileUtils.mv(
|
260
|
+
Termtter::CONF_DIR,
|
261
|
+
File.expand_path('~/.termtter___'))
|
262
|
+
Dir.mkdir(Termtter::CONF_DIR)
|
263
|
+
FileUtils.mv(
|
264
|
+
File.expand_path('~/.termtter___'),
|
265
|
+
Termtter::CONF_FILE)
|
266
|
+
end
|
267
|
+
|
256
268
|
def pre_config_load()
|
257
|
-
if
|
269
|
+
if config.system.devel
|
258
270
|
plugin 'devel'
|
259
271
|
end
|
260
272
|
end
|
@@ -277,7 +289,7 @@ module Termtter
|
|
277
289
|
handle_error(e)
|
278
290
|
end
|
279
291
|
}
|
280
|
-
vi_or_emacs =
|
292
|
+
vi_or_emacs = config.editing_mode
|
281
293
|
unless vi_or_emacs.empty?
|
282
294
|
Readline.__send__("#{vi_or_emacs}_editing_mode")
|
283
295
|
end
|
@@ -288,13 +300,13 @@ module Termtter
|
|
288
300
|
:name => :_update_timeline,
|
289
301
|
:exec_proc => lambda {|arg|
|
290
302
|
begin
|
291
|
-
|
303
|
+
args = @@since_id ? [{:since_id => @@since_id}] : []
|
304
|
+
statuses = Termtter::API.twitter.friends_timeline(*args)
|
292
305
|
unless statuses.empty?
|
293
306
|
@@since_id = statuses[0].id
|
294
307
|
end
|
295
|
-
print "\e[1K\e[0G" if !statuses.empty? && !win?
|
296
308
|
call_hooks(statuses, :update_friends_timeline)
|
297
|
-
|
309
|
+
statuses
|
298
310
|
rescue OpenURI::HTTPError => e
|
299
311
|
if e.message == '401 Unauthorized'
|
300
312
|
puts 'Could not login'
|
@@ -305,7 +317,7 @@ module Termtter
|
|
305
317
|
}
|
306
318
|
)
|
307
319
|
|
308
|
-
add_task(:name => :update_timeline, :interval =>
|
320
|
+
add_task(:name => :update_timeline, :interval => config.update_interval) do
|
309
321
|
call_commands('_update_timeline')
|
310
322
|
end
|
311
323
|
end
|
@@ -327,13 +339,20 @@ module Termtter
|
|
327
339
|
def start_input_thread
|
328
340
|
setup_readline()
|
329
341
|
trap_setting()
|
330
|
-
@@
|
331
|
-
|
332
|
-
|
333
|
-
|
342
|
+
@@input_thread = Thread.new do
|
343
|
+
while buf = Readline.readline(ERB.new(config.prompt).result(API.twitter.__send__(:binding)), true)
|
344
|
+
Readline::HISTORY.pop if /^(u|update)\s+(.+)$/ =~ buf
|
345
|
+
begin
|
346
|
+
call_commands(buf)
|
347
|
+
rescue CommandNotFound => e
|
348
|
+
warn "Unknown command \"#{e}\""
|
349
|
+
warn 'Enter "help" for instructions'
|
350
|
+
rescue => e
|
351
|
+
handle_error e
|
352
|
+
end
|
334
353
|
end
|
335
354
|
end
|
336
|
-
@@
|
355
|
+
@@input_thread.join
|
337
356
|
end
|
338
357
|
|
339
358
|
def run
|
@@ -354,21 +373,6 @@ module Termtter
|
|
354
373
|
start_input_thread()
|
355
374
|
end
|
356
375
|
|
357
|
-
def create_input_thread()
|
358
|
-
Thread.new do
|
359
|
-
while buf = Readline.readline(ERB.new(configatron.prompt).result(API.twitter.__send__(:binding)), true)
|
360
|
-
Readline::HISTORY.pop if /^(u|update)\s+(.+)$/ =~ buf
|
361
|
-
begin
|
362
|
-
call_commands(buf)
|
363
|
-
rescue CommandNotFound => e
|
364
|
-
puts "Unknown command \"#{buf}\""
|
365
|
-
puts 'Enter "help" for instructions'
|
366
|
-
end
|
367
|
-
end
|
368
|
-
exit # exit when press Control-D
|
369
|
-
end
|
370
|
-
end
|
371
|
-
|
372
376
|
def create_highline
|
373
377
|
HighLine.track_eof = false
|
374
378
|
if $stdin.respond_to?(:getbyte) # for ruby1.9
|
@@ -380,7 +384,7 @@ module Termtter
|
|
380
384
|
else
|
381
385
|
stdin_for_highline = $stdin
|
382
386
|
end
|
383
|
-
|
387
|
+
HighLine.new(stdin_for_highline)
|
384
388
|
end
|
385
389
|
|
386
390
|
def handle_error(e)
|
@@ -389,22 +393,6 @@ module Termtter
|
|
389
393
|
puts "Error: #{e}"
|
390
394
|
puts e.backtrace.join("\n")
|
391
395
|
end
|
392
|
-
|
393
|
-
def wrap_require
|
394
|
-
# FIXME: delete this method after the major version up
|
395
|
-
alias original_require require
|
396
|
-
def require(s)
|
397
|
-
if %r|^termtter/(.*)| =~ s
|
398
|
-
puts "[WARNING] use plugin '#{$1}' instead of require"
|
399
|
-
puts " Such a legacy .termtter file will not be supported until version 1.0.0"
|
400
|
-
s = "plugin/#{$1}"
|
401
|
-
end
|
402
|
-
original_require s
|
403
|
-
end
|
404
|
-
yield
|
405
|
-
alias require original_require
|
406
|
-
end
|
407
|
-
private :wrap_require
|
408
396
|
end
|
409
397
|
end
|
410
398
|
end
|