jugyo-termtter 1.0.3 → 1.0.6

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.
Files changed (45) hide show
  1. data/Rakefile +1 -1
  2. data/lib/plugins/addspace.rb +27 -0
  3. data/lib/plugins/bomb.rb +9 -12
  4. data/lib/plugins/expand-tinyurl.rb +12 -3
  5. data/lib/plugins/group.rb +10 -6
  6. data/lib/plugins/growl.rb +3 -3
  7. data/lib/plugins/history.rb +21 -10
  8. data/lib/plugins/log.rb +10 -10
  9. data/lib/plugins/msagent.rb +23 -11
  10. data/lib/plugins/notify-send.rb +17 -12
  11. data/lib/plugins/plugin.rb +1 -1
  12. data/lib/plugins/say.rb +8 -6
  13. data/lib/plugins/scrape.rb +1 -1
  14. data/lib/plugins/screen-notify.rb +17 -10
  15. data/lib/plugins/standard_plugins.rb +30 -19
  16. data/lib/plugins/stdout.rb +35 -54
  17. data/lib/plugins/storage/status.rb +23 -20
  18. data/lib/plugins/storage.rb +17 -23
  19. data/lib/plugins/update_editor.rb +1 -1
  20. data/lib/plugins/uri-open.rb +7 -5
  21. data/lib/plugins/url_addspace.rb +1 -1
  22. data/lib/termtter/api.rb +2 -1
  23. data/lib/termtter/client.rb +90 -118
  24. data/lib/termtter/command.rb +6 -1
  25. data/lib/termtter/hook.rb +7 -2
  26. data/lib/termtter/system_extensions.rb +15 -10
  27. data/lib/termtter/version.rb +1 -1
  28. data/lib/termtter.rb +11 -0
  29. data/spec/{plugin → plugins}/cool_spec.rb +0 -0
  30. data/spec/{plugin → plugins}/english_spec.rb +0 -0
  31. data/spec/{plugin → plugins}/favorite_spec.rb +0 -0
  32. data/spec/{plugin → plugins}/fib_spec.rb +0 -0
  33. data/spec/{plugin → plugins}/filter_spec.rb +0 -0
  34. data/spec/{plugin → plugins}/pause_spec.rb +0 -0
  35. data/spec/{plugin → plugins}/plugin_spec.rb +0 -0
  36. data/spec/{plugin → plugins}/primes_spec.rb +0 -0
  37. data/spec/{plugin → plugins}/shell_spec.rb +0 -0
  38. data/spec/{plugin → plugins}/sl_spec.rb +0 -0
  39. data/spec/{plugin → plugins}/spam_spec.rb +0 -0
  40. data/spec/{plugin → plugins}/standard_plugins_spec.rb +0 -0
  41. data/spec/{plugin → plugins}/storage/DB_spec.rb +0 -0
  42. data/spec/{plugin → plugins}/storage/status_spec.rb +1 -1
  43. data/spec/termtter/client_spec.rb +5 -8
  44. data/spec/termtter/command_spec.rb +10 -10
  45. metadata +18 -17
data/Rakefile CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
  s.add_dependency("json_pure", ">= 1.1.3")
27
27
  s.add_dependency("highline", ">= 1.5.0")
28
28
  s.add_dependency("termcolor", ">= 0.3.1")
29
- s.add_dependency("rubytter", ">= 0.4.8")
29
+ s.add_dependency("rubytter", ">= 0.6.3")
30
30
  s.add_dependency("sqlite3-ruby", ">= 1.2.4")
31
31
  s.authors = %w(jugyo ujihisa)
32
32
  s.email = 'jugyo.org@gmail.com'
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ config.plugins.addspace.set_default( :before, [ %r{https?://} ] )
4
+ config.plugins.addspace.set_default( :after, %w{ ★ ☆ △ ▽})
5
+
6
+ module Termtter::Client
7
+ add_filter do |statuses, event|
8
+ statuses.each do |s|
9
+ config.plugins.addspace.before.each do |c|
10
+ s.text.gsub!(/(\S)(#{c})/, '\1 \2' )
11
+ end
12
+ end
13
+ statuses.each do |s|
14
+ config.plugins.addspace.after.each do |c|
15
+ s.text.gsub!(/(#{c})(\S)/, '\1 \2' )
16
+ end
17
+ statuses
18
+ end
19
+ end
20
+ end
21
+ # addspace
22
+ # add space before or after specified words.
23
+ # example:
24
+ # before: ABCDEhttp://~~~
25
+ # after: ABCDE http://~~~
26
+ # before: ★★★
27
+ # after: ★ ★ ★
data/lib/plugins/bomb.rb CHANGED
@@ -1,24 +1,21 @@
1
1
  # -*- coding: utf-8 -*-
2
+ require 'enumerator'
2
3
 
3
4
  module Termtter
4
-
5
5
  module Client
6
- config.plugins.bomb.color.set_default :foreground, 'white'
7
- config.plugins.bomb.color.set_default :background, 'red'
6
+ config.plugins.bomb.set_default :format, "<on_red><white>%s</white></on_red>"
8
7
 
9
- add_hook do |statuses, event|
10
- case event
11
- when :post_filter
12
- fg = config.plugins.bomb.color.foreground
13
- bg = config.plugins.bomb.color.background
14
- statuses = [statuses] unless statuses.instance_of? Array
8
+ register_hook(
9
+ :name => :bomb,
10
+ :points => [:post_filter],
11
+ :exec_proc => lambda{|statuses, event|
15
12
  statuses.each do |status|
16
13
  if /爆発|bomb/ =~ status.text
17
- status.text = "<on_#{bg}><#{fg}>#{status.text}</#{fg}></on_#{bg}>"
14
+ status.text = config.plugins.bomb.format % status.text
18
15
  end
19
16
  end
20
- end
21
- end
17
+ }
18
+ )
22
19
 
23
20
  register_command(
24
21
  :name => :bomb, :aliases => [],
@@ -1,17 +1,25 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
+ URL_SHORTTERS = [
4
+ { :host => "tinyurl.com", :pattern => %r'(http://tinyurl\.com(/[\w/]+))' },
5
+ { :host => "is.gd", :pattern => %r'(http://is\.gd(/[\w/]+))' },
6
+ # { :host => "bit.ly", :pattern => %r'(http://bit\.ly(/[\w/]+))' }
7
+ ]
8
+
3
9
  module Termtter::Client
4
10
  add_filter do |statuses, event|
5
11
  statuses.each do |s|
6
- s.text.gsub!(%r'(http://tinyurl\.com(/[\w/]+))') do |m|
7
- expand_tinyurl($2) || $1
12
+ URL_SHORTTERS.each do |site|
13
+ s[:text].gsub!(site[:pattern]) do |m|
14
+ expand_url(site[:host], $2) || $1
15
+ end
8
16
  end
9
17
  end
10
18
  statuses
11
19
  end
12
20
  end
13
21
 
14
- def expand_tinyurl(path)
22
+ def expand_url(host, path)
15
23
  http_class = Net::HTTP
16
24
  unless config.proxy.host.nil? or config.proxy.host.empty?
17
25
  http_class = Net::HTTP::Proxy(config.proxy.host,
@@ -20,5 +28,6 @@ def expand_tinyurl(path)
20
28
  config.proxy.password)
21
29
  end
22
30
  res = http_class.new('tinyurl.com').head(path)
31
+ return nil unless res.code == "301" or res.code == "302"
23
32
  res['Location']
24
33
  end
data/lib/plugins/group.rb CHANGED
@@ -22,6 +22,10 @@ module Termtter::Client
22
22
  map {|u| b % u }
23
23
  end
24
24
 
25
+ def self.get_group_of(screen_name)
26
+ config.plugins.group.groups.select{ |k, v| v.include? screen_name}.map{|a| a.first}
27
+ end
28
+
25
29
  register_command(
26
30
  :name => :group,
27
31
  :aliases => [:g],
@@ -29,14 +33,14 @@ module Termtter::Client
29
33
  unless arg.empty?
30
34
  group_name = arg.to_sym
31
35
  if group_name == :all
32
- group = config.plugins.group.groups.values.flatten.uniq
36
+ targets = config.plugins.group.groups.values.flatten.uniq
33
37
  else
34
- group = config.plugins.group.groups[group_name]
38
+ targets = config.plugins.group.groups[group_name]
35
39
  end
36
- statuses = group ? public_storage[:log].select { |s|
37
- group.include?(s.user.screen_name)
38
- } : []
39
- call_hooks(statuses, :search)
40
+ statuses = targets ? targets.map { |target|
41
+ public_storage[:tweet][target]
42
+ }.flatten.uniq.compact.sort_by{ |s| s[:id]} : []
43
+ output(statuses, :search)
40
44
  else
41
45
  config.plugins.group.groups.each_pair do |key, value|
42
46
  puts "#{key}: #{value.join(',')}"
data/lib/plugins/growl.rb CHANGED
@@ -54,8 +54,8 @@ Thread.new do
54
54
  end
55
55
 
56
56
  Termtter::Client.register_hook(:name => :growl,
57
- :points => [:post_exec__update_timeline],
58
- :exec_proc => lambda { |cmd, arg, result|
59
- result.reverse.each { |s| queue << s }
57
+ :points => [:post_filter],
58
+ :exec_proc => lambda {|statuses, event|
59
+ statuses.each {|s| queue << s} if event == :update_friends_timeline
60
60
  }
61
61
  )
@@ -3,9 +3,9 @@
3
3
  require 'zlib'
4
4
 
5
5
  config.plugins.history.
6
- set_default(:filename, '~/.termtter_history')
6
+ set_default(:filename, Termtter::CONF_DIR + '/history')
7
7
  config.plugins.history.
8
- set_default(:keys, [:log, :users, :status_ids])
8
+ set_default(:keys, [:users, :status_ids])
9
9
  config.plugins.history.
10
10
  set_default(:max_of_history, 100)
11
11
  config.plugins.history.
@@ -51,14 +51,17 @@ module Termtter::Client
51
51
  puts "history saved(#{File.size(filename)/1000}kb)"
52
52
  end
53
53
 
54
- add_hook do |statuses, event|
55
- case event
56
- when :initialize
57
- load_history
58
- when :exit
59
- save_history
60
- end
61
- end
54
+ register_hook(
55
+ :name => :history_initialize,
56
+ :points => [:initialize],
57
+ :exec_proc => lambda { load_history; logger.debug('load_history') }
58
+ )
59
+
60
+ register_hook(
61
+ :name => :history_exit,
62
+ :points => [:exit],
63
+ :exec_proc => lambda { save_history; logger.debug('save_history') }
64
+ )
62
65
 
63
66
  if config.plugins.history.enable_autosave
64
67
  Termtter::Client.add_task(:interval => config.plugins.history.autosave_interval,
@@ -75,6 +78,14 @@ module Termtter::Client
75
78
  :help => ['save', 'Save hisory']
76
79
  )
77
80
 
81
+ register_command(
82
+ :name => :load,
83
+ :exec_proc => lambda{|arg|
84
+ load_history
85
+ },
86
+ :help => ['load', 'Load hisory']
87
+ )
88
+
78
89
 
79
90
  end
80
91
 
data/lib/plugins/log.rb CHANGED
@@ -6,19 +6,19 @@ module Termtter::Client
6
6
  config.plugins.log.set_default('max_size', 1/0.0)
7
7
  config.plugins.log.set_default('print_max_size', 30)
8
8
 
9
- add_hook do |statuses, event|
10
- case event
11
- when :pre_filter
9
+ register_hook(
10
+ :name => :log,
11
+ :points => [:pre_filter],
12
+ :exec_proc => lambda {|statuses, event|
12
13
  # log(sequential storage)
13
14
  public_storage[:log] += statuses
14
15
  max_size = config.plugins.log.max_size
15
16
  if public_storage[:log].size > max_size
16
17
  public_storage[:log] = public_storage[:log][-max_size..-1]
17
18
  end
18
- public_storage[:log] = public_storage[:log].uniq.sort_by{|a| a.created_at} if statuses.first
19
+ public_storage[:log] = public_storage[:log].uniq.sort_by{|s| s.created_at} if statuses.first
19
20
 
20
21
  # tweet(storage for each user)
21
-
22
22
  statuses.each do |s|
23
23
  public_storage[:tweet][s.user.screen_name] = [] unless public_storage[:tweet][s.user.screen_name]
24
24
  public_storage[:tweet][s.user.screen_name] << s
@@ -26,8 +26,8 @@ module Termtter::Client
26
26
  public_storage[:tweet] = public_storage[:tweet][-max_size..-1]
27
27
  end
28
28
  end
29
- end
30
- end
29
+ }
30
+ )
31
31
 
32
32
  register_command(
33
33
  :name => :log,
@@ -37,7 +37,7 @@ module Termtter::Client
37
37
  statuses = public_storage[:log]
38
38
  print_max = config.plugins.log.print_max_size
39
39
  print_max = 0 if statuses.size < print_max
40
- call_hooks(statuses[-print_max..-1], :search)
40
+ output(statuses[-print_max..-1], :search)
41
41
  else
42
42
  # log (user) (max)
43
43
  vars = arg.split(' ')
@@ -45,7 +45,7 @@ module Termtter::Client
45
45
  id = vars
46
46
  statuses = id.first ? public_storage[:log].select{ |s| id.include? s.user.screen_name} : public_storage[:log]
47
47
  print_max = 0 if statuses.size < print_max
48
- call_hooks(statuses[-print_max..-1], :search)
48
+ output(statuses[-print_max..-1], :search)
49
49
  end
50
50
  },
51
51
  :completion_proc => lambda {|cmd, arg|
@@ -60,7 +60,7 @@ module Termtter::Client
60
60
  unless arg.strip.empty?
61
61
  pat = Regexp.new arg
62
62
  statuses = public_storage[:log].select { |s| s.text =~ pat }
63
- call_hooks(statuses, :search)
63
+ output(statuses, :search)
64
64
  end
65
65
  },
66
66
  :help => [ 'search_log WORD', 'Search log for WORD' ]
@@ -11,16 +11,28 @@ achar = agent.characters.character("Merlin")
11
11
  achar.languageID = 0x411
12
12
  achar.show
13
13
 
14
- Termtter::Client.add_hook do |statuses, event, t|
15
- if event == :exit
14
+ Termtter::Client.register_hook(
15
+ :name => :msagent,
16
+ :points => [:post_filter],
17
+ :exec_proc => lambda {|statuses, event|
18
+ if !statuses.empty? && event == :update_friends_timeline
19
+ Thread.start do
20
+ statuses.reverse.each do |s|
21
+ req = achar.speak("#{s[:screen_name]}: #{s[:text]}".tosjis)
22
+ sleep 1
23
+ WIN32OLE_EVENT.message_loop
24
+ achar.stop(req)
25
+ end
26
+ end
27
+ end
28
+ }
29
+ )
30
+
31
+ Termtter::Client.register_hook(
32
+ :name => :msagent_exit,
33
+ :points => [:exit],
34
+ :exec_proc => lambda {
16
35
  achar.hide
17
36
  GC.start
18
- elsif !statuses.empty? && event == :update_friends_timeline
19
- statuses.reverse.each do |s|
20
- req = achar.speak("#{s.user.screen_name}: #{s.text}".tosjis)
21
- sleep 3
22
- WIN32OLE_EVENT.message_loop
23
- achar.stop(req)
24
- end
25
- end
26
- end
37
+ }
38
+ )
@@ -1,17 +1,22 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
- Termtter::Client.add_hook do |statuses, event|
4
- if !statuses.empty? && event == :update_friends_timeline
5
- max = 10
3
+ Termtter::Client.register_hook(
4
+ :name => :notify_send,
5
+ :points => [:post_filter],
6
+ :exec_proc => lambda {|statuses, event|
7
+ if event == :update_friends_timeline
8
+ max = 10
6
9
 
7
- text = statuses.take(max).map {|s|
8
- status_text = CGI.escapeHTML(s.text)
9
- status_text.gsub!(%r{https?://[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+},'<a href="\0">\0</a>')
10
- "<b>#{s.user.screen_name}:</b> <span font=\"9.0\">#{status_text}</span>"
11
- }.join("\n")
10
+ text = statuses.take(max).map {|s|
11
+ status_text = CGI.escapeHTML(s[:text])
12
+ status_text.gsub!(%r{https?://[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+},'<a href="\0">\0</a>')
13
+ "<b>#{s[:screen_name]}:</b> <span font=\"9.0\">#{status_text}</span>"
14
+ }.join("\n")
12
15
 
13
- text << %Q|\n<a href="http://twitter.com/">more...</a>| if statuses.size > max
16
+ text << %Q|\n<a href="http://twitter.com/">more...</a>| if statuses.size > max
17
+
18
+ system 'notify-send', 'Termtter', text, '-t', '60000'
19
+ end
20
+ }
21
+ )
14
22
 
15
- system 'notify-send', 'Termtter', text, '-t', '60000'
16
- end
17
- end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Termtter::Client
4
4
 
5
- public_storage[:plugins] = Dir["#{File.dirname(__FILE__)}/*.rb"].map do |f|
5
+ public_storage[:plugins] = (Dir["#{File.dirname(__FILE__)}/*.rb"] + Dir["#{Termtter::CONF_DIR}/plugins/*.rb"]).map do |f|
6
6
  f.match(%r|([^/]+).rb$|)[1]
7
7
  end
8
8
 
data/lib/plugins/say.rb CHANGED
@@ -10,14 +10,16 @@ def say(who, what)
10
10
  end
11
11
 
12
12
  module Termtter::Client
13
- add_hook do |statuses, event, t|
14
- if !statuses.empty? && event == :update_friends_timeline
13
+ register_hook(
14
+ :name => :say,
15
+ :points => [:post_filter],
16
+ :exec_proc => lambda {|statuses, event|
15
17
  statuses.reverse.each do |s|
16
- text_without_uri = s.text.gsub(%r|https?://[^\s]+|, 'U.R.I.')
17
- say s.user.screen_name, text_without_uri
18
+ text_without_uri = s[:text].gsub(%r|https?://[^\s]+|, 'U.R.I.')
19
+ say s[:screen_name], text_without_uri
18
20
  end
19
- end
20
- end
21
+ }
22
+ )
21
23
  end
22
24
 
23
25
  # KNOWN BUG:
@@ -29,7 +29,7 @@ module Termtter::Client
29
29
  members += config.plugins.group.groups[group]
30
30
  end
31
31
  statuses = scrape_members(members.uniq.compact.sort)
32
- call_hooks(statuses, :pre_filter)
32
+ output(statuses_to_hash(statuses), :pre_filter)
33
33
  },
34
34
  :completion_proc => lambda {|cmd, args|
35
35
  arg = args.split(' ').last
@@ -1,13 +1,20 @@
1
+ # -*- coding: utf-8 -*-
1
2
 
2
- if config.screen_notify.format.nil? or config.screen_notify.format.empty?
3
- config.screen_notify.format = "[termtter] @%s"
4
- end
3
+ config.screen_notify.set_default(:format, "[termtter] %s")
5
4
 
6
- Termtter::Client.add_hook do |statuses, event|
7
- if !statuses.empty? && event == :update_friends_timeline
8
- statuses.reverse.each do |s|
9
- msg = config.screen_notify.format % [s.user.screen_name, s.text]
10
- system 'screen', '-X', 'eval', "bell_msg '#{msg}'", 'bell'
11
- end
12
- end
5
+ module Termtter::Client
6
+ register_hook(
7
+ :name => :screen_notify,
8
+ :points => [:post_filter],
9
+ :exec_proc => lambda{|statuses, event|
10
+ return unless event = :update_friends_timeline
11
+ Thread.new(statuses) do |ss|
12
+ ss.each do |s|
13
+ msg = config.screen_notify.format % s.user.screen_name
14
+ system 'screen', '-X', 'eval', "bell_msg '#{msg}'", 'bell'
15
+ sleep 1
16
+ end
17
+ end
18
+ }
19
+ )
13
20
  end
@@ -2,6 +2,10 @@
2
2
 
3
3
  require 'erb'
4
4
 
5
+ config.plugins.standard.set_default(
6
+ :limit_format,
7
+ '<<%=remaining_color%>><%=limit.remaining_hits%></<%=remaining_color%>>/<%=limit.hourly_limit%> until <%=limit.reset_time%> (<%=remaining_time%> remaining)')
8
+
5
9
  module Termtter::Client
6
10
 
7
11
  # standard commands
@@ -10,8 +14,9 @@ module Termtter::Client
10
14
  :name => :update, :aliases => [:u],
11
15
  :exec_proc => lambda {|arg|
12
16
  unless arg =~ /^\s*$/
17
+ # TODO: Change to able to disable erb.
13
18
  text = ERB.new(arg).result(binding).gsub(/\n/, ' ')
14
- result = Termtter::API.twitter.update(text, :source=>Termtter::APP_NAME)
19
+ result = Termtter::API.twitter.update(text)
15
20
  puts "=> #{text}"
16
21
  result
17
22
  end
@@ -78,11 +83,14 @@ module Termtter::Client
78
83
  register_command(
79
84
  :name => :list, :aliases => [:l],
80
85
  :exec_proc => lambda {|arg|
81
- unless arg.empty?
82
- call_hooks(Termtter::API.twitter.user_timeline(arg), :list_user_timeline)
86
+ if arg.empty?
87
+ event = :list_friends_timeline
88
+ statuses = Termtter::API.twitter.friends_timeline()
83
89
  else
84
- call_hooks(Termtter::API.twitter.friends_timeline(), :list_friends_timeline)
90
+ event = :list_user_timeline
91
+ statuses = Termtter::API.twitter.user_timeline(arg)
85
92
  end
93
+ output(statuses, event)
86
94
  },
87
95
  :completion_proc => lambda {|cmd, arg|
88
96
  find_user_candidates arg, "#{cmd} %s"
@@ -92,14 +100,15 @@ module Termtter::Client
92
100
  register_command(
93
101
  :name => :search, :aliases => [:s],
94
102
  :exec_proc => lambda {|arg|
95
- call_hooks(Termtter::API.twitter.search(arg), :search)
103
+ statuses = Termtter::API.twitter.search(arg)
104
+ output(statuses, :search)
96
105
  }
97
106
  )
98
107
 
99
108
  register_command(
100
109
  :name => :replies, :aliases => [:r],
101
110
  :exec_proc => lambda {|arg|
102
- call_hooks(Termtter::API.twitter.replies(), :replies)
111
+ output(Termtter::API.twitter.replies(), :replies)
103
112
  }
104
113
  )
105
114
 
@@ -107,7 +116,7 @@ module Termtter::Client
107
116
  :name => :show,
108
117
  :exec_proc => lambda {|arg|
109
118
  id = arg.gsub(/.*:\s*/, '')
110
- call_hooks(Termtter::API.twitter.show(id), :show)
119
+ output([Termtter::API.twitter.show(id)], :show)
111
120
  },
112
121
  :completion_proc => lambda {|cmd, arg|
113
122
  case arg
@@ -128,7 +137,8 @@ module Termtter::Client
128
137
  :name => :shows,
129
138
  :exec_proc => lambda {|arg|
130
139
  id = arg.gsub(/.*:\s*/, '')
131
- call_hooks(Termtter::API.twitter.show(id, true), :show)
140
+ # TODO: Implement
141
+ output([Termtter::API.twitter.show(id)], :show)
132
142
  },
133
143
  :completion_proc => get_command(:show).completion_proc
134
144
  )
@@ -176,7 +186,8 @@ module Termtter::Client
176
186
  when 0..0.2 then :red
177
187
  else :green
178
188
  end
179
- puts "=> #{color(limit.remaining_hits, remaining_color)}/#{limit.hourly_limit} until #{limit.reset_time} (#{remaining_time} remaining)"
189
+ erbed_text = ERB.new(config.plugins.standard.limit_format).result(binding)
190
+ puts TermColor.parse(erbed_text)
180
191
  },
181
192
  :help => ["limit,lm", "Show the API limit status"]
182
193
  )
@@ -229,14 +240,13 @@ module Termtter::Client
229
240
  ["list,l", "List the posts in your friends timeline"],
230
241
  ["list,l USERNAME", "List the posts in the the given user's timeline"],
231
242
  ["update,u TEXT", "Post a new message"],
232
- ["direct,d @USERNAME TEXT", "Send direct message"],
243
+ ["direct,d USERNAME TEXT", "Send direct message"],
233
244
  ["profile,p USERNAME", "Show user's profile"],
234
245
  ["replies,r", "List the most recent @replies for the authenticating user"],
235
246
  ["search,s TEXT", "Search for Twitter"],
236
247
  ["show ID", "Show a single status"]
237
248
  ]
238
- helps += @@helps
239
- helps += @@new_commands.map {|name, command| command.help}
249
+ helps += @commands.map {|name, command| command.help}
240
250
  helps.compact!
241
251
  puts formatted_help(helps)
242
252
  }
@@ -272,17 +282,18 @@ module Termtter::Client
272
282
  public_storage[:users] ||= Set.new
273
283
  public_storage[:status_ids] ||= Set.new
274
284
 
275
- add_hook do |statuses, event, t|
276
- case event
277
- when :update_friends_timeline, :list_friends_timeline, :list_user_timeline, :replies
285
+ register_hook(
286
+ :name => :for_completion,
287
+ :points => [:pre_filter],
288
+ :exec_proc => lambda {|statuses, event|
278
289
  statuses.each do |s|
279
290
  public_storage[:users].add(s.user.screen_name)
280
291
  public_storage[:users] += s.text.scan(/@([a-zA-Z_0-9]*)/).flatten
281
- public_storage[:status_ids].add(s.id.to_s)
282
- public_storage[:status_ids].add(s.in_reply_to_status_id.to_s) if s.in_reply_to_status_id
292
+ public_storage[:status_ids].add(s.id)
293
+ public_storage[:status_ids].add(s.in_reply_to_status_id) if s.in_reply_to_status_id
283
294
  end
284
- end
285
- end
295
+ }
296
+ )
286
297
 
287
298
  def self.find_status_ids(text)
288
299
  public_storage[:status_ids].select{|id| id =~ /#{Regexp.quote(text)}/}
@@ -11,68 +11,49 @@ config.plugins.stdout.set_default(
11
11
  '<90><%=time%></90> <<%=status_color%>><%=status%></<%=status_color%>> <90><%=id%></90>')
12
12
  config.plugins.stdout.set_default(:search_highlihgt_format, '<on_magenta><white>\1</white></on_magenta>')
13
13
 
14
- $highline = HighLine.new
15
-
16
- def color(str, value)
17
- return str if value == :none
18
- case value
19
- when String, Symbol
20
- $highline.color(str, value)
21
- else
22
- "\e[#{value}m#{str}\e[0m"
23
- end
24
- end
25
-
26
- module Termtter::Client
27
-
28
- def self.print_statuses(statuses, sort = true, time_format = '%H:%M:%S')
29
- (sort ? statuses.sort_by{ |s| s.id} : statuses).each do |s|
30
- text = s.text
31
- status_color = config.plugins.stdout.colors[s.user.screen_name.hash % config.plugins.stdout.colors.size]
32
- status = "#{s.user.screen_name}: #{text}"
33
- if s.in_reply_to_status_id
34
- status += " (repl. to #{s.in_reply_to_status_id})"
35
- end
36
-
37
- time = "(#{Time.parse(s.created_at).strftime(time_format)})"
38
- id = s.id
39
- erbed_text = ERB.new(config.plugins.stdout.timeline_format).result(binding)
40
- puts TermColor.parse(erbed_text)
14
+ module Termtter
15
+ class StdOut < Hook
16
+ def initialize
17
+ super(:name => :stdout, :points => [:output])
41
18
  end
42
- end
43
-
44
- def self.print_statuses_with_date(statuses, sort = true)
45
- print_statuses(statuses, sort, '%m-%d %H:%M')
46
- end
47
19
 
48
- def self.print_search_results(result, time_format = '%H:%M:%S')
49
- result.results.sort_by{|r| r.created_at}.each do |r|
50
- text = r.text.
51
- gsub(/(\n|\r)/, '').
52
- gsub(/(#{Regexp.escape(result.query)})/i, config.plugins.stdout.search_highlihgt_format)
53
- status_color = config.plugins.stdout.colors[r.from_user_id.to_i.hash % config.plugins.stdout.colors.size]
54
- status = "#{r.from_user}: #{text}"
55
- time = "(#{Time.parse(r.created_at).strftime(time_format)})"
56
- id = r.id
57
- erbed_text = ERB.new(config.plugins.stdout.timeline_format).result(binding)
58
- puts TermColor.parse(erbed_text)
20
+ def call(statuses, event)
21
+ print_statuses(statuses)
59
22
  end
60
- end
61
23
 
62
- add_hook do |result, event|
63
- case event
64
- when :update_friends_timeline, :list_friends_timeline
65
- print_statuses(result) unless result.empty?
66
- when :list_user_timeline, :replies
67
- print_statuses_with_date(result) unless result.empty?
68
- when :show
69
- print_statuses_with_date([result])
70
- when :search
71
- print_search_results(result)
24
+ def print_statuses(statuses, sort = true, time_format = nil)
25
+ return unless statuses and statuses.first
26
+ unless time_format
27
+ # 最初と最後の日付がちがうとき日付も出す
28
+ t1 = Time.parse(statuses.first[:created_at])
29
+ t2 = Time.parse(statuses.last[:created_at])
30
+ time_format =
31
+ if [t1.year, t1.month, t1.day] == [t2.year, t2.month, t2.day]
32
+ '%H:%M:%S'
33
+ else
34
+ '%y/%m/%d %H:%M'
35
+ end
36
+ end
37
+
38
+ statuses.each do |s|
39
+ text = s.text
40
+ status_color = config.plugins.stdout.colors[s.user.id.hash % config.plugins.stdout.colors.size]
41
+ status = "#{s.user.screen_name}: #{text}"
42
+ if s.in_reply_to_status_id
43
+ status += " (repl. to #{s.in_reply_to_status_id})"
44
+ end
45
+
46
+ time = "(#{Time.parse(s.created_at).strftime(time_format)})"
47
+ id = s.id
48
+ erbed_text = ERB.new(config.plugins.stdout.timeline_format).result(binding)
49
+ puts TermColor.parse(erbed_text)
50
+ end
72
51
  end
73
52
  end
74
53
 
54
+ Client.register_hook(StdOut.new)
75
55
  end
56
+
76
57
  # stdout.rb
77
58
  # output statuses to stdout
78
59
  # example config