termtter 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,3 +1,27 @@
1
+ == 1.3.1 2009-08-10
2
+
3
+ Takaaki SONE:
4
+ Fixed help message for Exit
5
+ added protected column to users table.
6
+
7
+ Tomohiro Nishimura:
8
+ add new command around the alias
9
+ more powerful list command available!
10
+ add alias method to Client module
11
+
12
+ emasaka:
13
+ Added protected sign to default timeline_format.
14
+ Added hugeurl plugin: alternative of expand-tinyurl
15
+
16
+ jugyo:
17
+ Fixed for termtter shutdown when raise network error.
18
+ Added a method 'command_exists?'
19
+ Changed to apply TermColor.unescape for status.text
20
+ Changed retweet command to add confirmation for protected user.
21
+
22
+ ujihisa:
23
+ Ignore case for completion of user's screen name
24
+
1
25
  == 1.3.0 2009-07-27
2
26
 
3
27
  Koichiro Ohba (3):
data/lib/plugins/db.rb CHANGED
@@ -21,6 +21,7 @@ unless DB.table_exists?(:users)
21
21
  DB.create_table :users do
22
22
  primary_key :id
23
23
  String :screen_name
24
+ boolean :protected
24
25
  end
25
26
  end
26
27
 
@@ -56,7 +57,12 @@ module Termtter
56
57
  if User.filter(:id => s.user.id).empty?
57
58
  user = {}
58
59
  User.columns.each do |col|
59
- user[col] = s.user[col]
60
+ user[col] =
61
+ if event == :search && col == :protected
62
+ false
63
+ else
64
+ s.user[col]
65
+ end
60
66
  end
61
67
  User << user
62
68
  end
@@ -1,12 +1,22 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  module Termtter::Client
3
3
  add_task(:name => :auto_reload, :interval => config.update_interval, :after => config.update_interval) do
4
- call_commands('reload')
4
+ begin
5
+ call_commands('reload')
6
+ rescue Exception => e
7
+ handle_error(e)
8
+ end
5
9
  end
6
10
 
7
11
  register_hook(
8
12
  :name => :auto_reload_init,
9
13
  :point => :initialize,
10
- :exec => lambda { call_commands('reload') }
14
+ :exec => lambda {
15
+ begin
16
+ call_commands('reload')
17
+ rescue Exception => e
18
+ handle_error(e)
19
+ end
20
+ }
11
21
  )
12
22
  end
@@ -4,6 +4,11 @@ config.plugins.retweet.set_default(:format, '<%= comment %>RT @<%=s.user.screen_
4
4
 
5
5
  module Termtter::Client
6
6
  def self.post_retweet(s, comment = nil)
7
+ if s.user.protected &&
8
+ !confirm("#{s.user.screen_name} is protected! Are you sure?", false)
9
+ return
10
+ end
11
+
7
12
  comment += ' ' unless comment.nil?
8
13
  text = ERB.new(config.plugins.retweet.format).result(binding)
9
14
  Termtter::API.twitter.update(text)
@@ -143,8 +143,11 @@ module Termtter::Client
143
143
  statuses = Termtter::API.twitter.friends_timeline
144
144
  else
145
145
  event = :list_user_timeline
146
- user_name = normalize_as_user_name(arg)
147
- statuses = Termtter::API.twitter.user_timeline(user_name)
146
+ statuses = []
147
+ Array(arg.split).each do |user|
148
+ user_name = normalize_as_user_name(user)
149
+ statuses += Termtter::API.twitter.user_timeline(user_name)
150
+ end
148
151
  end
149
152
  output(statuses, event)
150
153
  },
@@ -327,7 +330,7 @@ module Termtter::Client
327
330
  register_command(
328
331
  :name => :exit, :aliases => [:quit],
329
332
  :exec_proc => lambda {|arg| exit},
330
- :help => ['exit,e', 'Exit']
333
+ :help => ['exit,quit', 'Exit']
331
334
  )
332
335
 
333
336
  register_command(
@@ -472,6 +475,35 @@ module Termtter::Client
472
475
  :help => ["redo,.", "Execute previous command"]
473
476
  )
474
477
 
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
+
475
507
  def self.update_with_user_and_id(text, username, id)
476
508
  text = "@#{username} #{text}"
477
509
  result = Termtter::API.twitter.update(text, {'in_reply_to_status_id' => id})
@@ -27,7 +27,7 @@ module Termtter::Client
27
27
  register_hook(:collect_user_names, :point => :pre_filter) do |statuses, event|
28
28
  statuses.each do |s|
29
29
  public_storage[:users].add(s.user.screen_name)
30
- public_storage[:users] += s.text.scan(/@([a-zA-Z_0-9]*)/).flatten
30
+ public_storage[:users] += s.text.scan(/@([a-zA-Z_0-9]*)/i).flatten
31
31
  end
32
32
  end
33
33
 
@@ -40,7 +40,7 @@ module Termtter::Client
40
40
  if part_of_user_name.nil? || part_of_user_name.empty?
41
41
  public_storage[:users].to_a
42
42
  else
43
- public_storage[:users].grep(/^#{Regexp.quote(part_of_user_name)}/)
43
+ public_storage[:users].grep(/^#{Regexp.quote(part_of_user_name)}/i)
44
44
  end
45
45
 
46
46
  users.map {|u| "#{command_str}@%s" % u }
@@ -54,7 +54,7 @@ module Termtter::Client
54
54
  public_storage[:hashtag] ||= Set.new
55
55
 
56
56
  register_hook(:collect_hashtags, :point => /^post_exec_/) do |cmd, arg, result|
57
- public_storage[:hashtag] += arg.scan(/\s+#([^\s]+)/).flatten if arg
57
+ public_storage[:hashtag] += arg.scan(/\s+#([^\s]+)/i).flatten if arg
58
58
  end
59
59
 
60
60
  register_hook(:hashtags_completion, :point => :completion) do |input|
@@ -8,7 +8,7 @@ config.plugins.stdout.set_default(:colors, (31..36).to_a + (91..96).to_a)
8
8
  config.plugins.stdout.set_default(
9
9
  :timeline_format,
10
10
  '<90><%=time%> [<%=status_id%>]</90> <<%=color%>><%=s.user.screen_name%>: <%=text%></<%=color%>> ' +
11
- '<90><%=reply_to_status_id ? " (reply_to [#{reply_to_status_id}]) " : ""%><%=source%></90>'
11
+ '<90><%=reply_to_status_id ? " (reply_to [#{reply_to_status_id}]) " : ""%><%=source%><%=s.user.protected ? "[P]" : ""%></90>'
12
12
  )
13
13
  config.plugins.stdout.set_default(:enable_pager, true)
14
14
  config.plugins.stdout.set_default(:pager, 'less -R -f +G')
@@ -115,6 +115,7 @@ module Termtter
115
115
  erbed_text = ERB.new(config.plugins.stdout.timeline_format).result(binding)
116
116
  indent_text = indent > 0 ? "#{' ' * (indent - 1)} ┗ " : ''
117
117
  text = TermColor.parse(indent_text + erbed_text) + "\n"
118
+ text = TermColor.unescape(text)
118
119
  if config.plugins.stdout.show_as_thread && s.in_reply_to_status_id
119
120
  text << status_line(Status[s.in_reply_to_status_id], time_format, indent + 1)
120
121
  end
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ HUGEURL_TARGET_PATTERN = %r{
4
+ http://tinyurl\.com/[\w/]+
5
+ | http://is\.gd/[\w/]+
6
+ | http://bit\.ly/[\w/]+
7
+ | http://ff\.im/[-\w/]+
8
+ | http://tr\.im/[\w/]+
9
+ }x
10
+
11
+ config.plugins.hugeurl.set_default(:skip_users, [])
12
+
13
+ Termtter::Client::register_hook(
14
+ :name => :hugeurl,
15
+ :point => :filter_for_output,
16
+ :exec_proc => lambda do |statuses, event|
17
+ http_class = Net::HTTP
18
+ unless config.proxy.host.nil? or config.proxy.host.empty?
19
+ http_class = Net::HTTP::Proxy(config.proxy.host,
20
+ config.proxy.port,
21
+ config.proxy.user_name,
22
+ config.proxy.password)
23
+ end
24
+ http_class.start('search.twitter.com') do |http|
25
+ statuses.each do |s|
26
+ config.plugins.hugeurl.skip_users.include?(s.user.screen_name) and next
27
+ s.text.gsub!(HUGEURL_TARGET_PATTERN) do |m|
28
+ res = http.get('/hugeurl?url=' + m)
29
+ res.code == '200' ? res.body : m
30
+ end
31
+ end
32
+ end
33
+ statuses
34
+ end
35
+ )
36
+
37
+ # hugeurl.rb:
38
+ # expands bit.ly, tiniurl, etc. by search.twitter.com API
@@ -13,6 +13,7 @@ module Termtter
13
13
  @hooks = {}
14
14
  @commands = {}
15
15
  @filters = []
16
+ @aliases = {}
16
17
  @since_id = nil
17
18
  @task_manager = Termtter::TaskManager.new
18
19
 
@@ -41,6 +42,10 @@ module Termtter
41
42
  Termtter::Client.handle_error(e)
42
43
  end
43
44
 
45
+ def alias(name, value)
46
+ @aliases[name] = value
47
+ end
48
+
44
49
  def public_storage
45
50
  @public_storage ||= {}
46
51
  end
@@ -125,6 +130,17 @@ module Termtter
125
130
  register_command(command)
126
131
  end
127
132
 
133
+ def add_alias(from, to, confirm = true)
134
+ if confirm
135
+ raise 'Already exist' if @aliases[from]
136
+ end
137
+ @aliases[from] = to
138
+ end
139
+
140
+ def remove_alias(target)
141
+ @aliases.delete target
142
+ end
143
+
128
144
  # statuses => [status, status, ...]
129
145
  # status => {
130
146
  # :id => status id,
@@ -176,7 +192,6 @@ module Termtter
176
192
 
177
193
  def call_commands(text)
178
194
  @task_manager.invoke_and_wait do
179
- call_hooks("pre_command", text)
180
195
  # FIXME: This block can become Maybe Monad
181
196
  get_hooks("pre_command").each {|hook|
182
197
  break if text == nil # interrupt if hook returns nil
@@ -208,6 +223,10 @@ module Termtter
208
223
  end
209
224
  end
210
225
 
226
+ def command_exists?(text)
227
+ @commands.values.any? {|command| command.match?(text) }
228
+ end
229
+
211
230
  def find_commands(text)
212
231
  @commands.values.select {|command| command.match?(text) }
213
232
  end
@@ -1,4 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  module Termtter
3
- VERSION = '1.3.0'
3
+ VERSION = '1.3.1'
4
4
  end
@@ -368,6 +368,13 @@ module Termtter
368
368
  Client.find_commands('bar').size.should == 1
369
369
  end
370
370
 
371
+ it 'check command exists' do
372
+ Client.command_exists?('foo').should == false
373
+ Client.command_exists?('foo1').should == true
374
+ Client.command_exists?('bar').should == true
375
+ Client.command_exists?('foo1 bar').should == true
376
+ end
377
+
371
378
  it 'finds no command' do
372
379
  Client.find_commands('foo').size.should == 0
373
380
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: termtter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - jugyo
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-07-27 00:00:00 +09:00
13
+ date: 2009-08-10 00:00:00 +09:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -106,6 +106,7 @@ files:
106
106
  - lib/plugins/http_server/favicon.ico
107
107
  - lib/plugins/http_server/index.html
108
108
  - lib/plugins/http_server.rb
109
+ - lib/plugins/hugeurl.rb
109
110
  - lib/plugins/ignore.rb
110
111
  - lib/plugins/irb.rb
111
112
  - lib/plugins/irc_gw.rb