jugyo-termtter 0.7.0 → 0.7.5

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/Manifest.txt CHANGED
@@ -3,31 +3,41 @@ Manifest.txt
3
3
  PostInstall.txt
4
4
  README.rdoc
5
5
  Rakefile
6
- run_termtter.rb
7
6
  bin/termtter
8
- lib/termtter.rb
9
- lib/filter.rb
7
+ lib/filter/en2ja.rb
8
+ lib/filter/english.rb
9
+ lib/filter/expand-tinyurl.rb
10
+ lib/filter/fib.rb
11
+ lib/filter/reverse.rb
12
+ lib/filter/yhara.rb
13
+ lib/plugin/bomb.rb
14
+ lib/plugin/confirm.rb
10
15
  lib/plugin/english.rb
11
16
  lib/plugin/erb.rb
12
17
  lib/plugin/favorite.rb
13
18
  lib/plugin/fib.rb
14
19
  lib/plugin/filter.rb
20
+ lib/plugin/follow.rb
21
+ lib/plugin/group.rb
15
22
  lib/plugin/growl.rb
23
+ lib/plugin/history.rb
16
24
  lib/plugin/keyword.rb
17
25
  lib/plugin/log.rb
18
26
  lib/plugin/notify-send.rb
19
27
  lib/plugin/plugin.rb
28
+ lib/plugin/quicklook.rb
29
+ lib/plugin/reload.rb
20
30
  lib/plugin/say.rb
21
31
  lib/plugin/shell.rb
32
+ lib/plugin/sl.rb
33
+ lib/plugin/spam.rb
22
34
  lib/plugin/standard_plugins.rb
23
35
  lib/plugin/stdout.rb
24
36
  lib/plugin/translation.rb
25
37
  lib/plugin/uri-open.rb
26
- lib/filter/english.rb
27
- lib/filter/reverse.rb
28
- lib/filter/yhara.rb
29
- lib/filter/expand-tinyurl.rb
30
- lib/filter/en2ja.rb
31
- test/test_termtter.rb
38
+ lib/plugin/yhara.rb
39
+ lib/termtter.rb
40
+ run_termtter.rb
32
41
  test/friends_timeline.json
33
42
  test/search.json
43
+ test/test_termtter.rb
data/README.rdoc CHANGED
@@ -24,6 +24,15 @@ Run:
24
24
  sudo gem source -a http://gems.github.com (you only have to do this once)
25
25
  sudo gem install jugyo-termtter
26
26
 
27
+ if you want to install gem package from source code, install like following.
28
+
29
+ git clone git://github.com/jugyo/termtter.git
30
+ cd termtter
31
+ rake manifest
32
+ rake gemspec
33
+ gem build termtter.gemspec
34
+ gem install *.gem
35
+
27
36
  Just run a new command termtter.
28
37
 
29
38
  termtter
@@ -36,12 +45,23 @@ You can edit the file anytime.
36
45
  configatron.user_name = 'USERNAME'
37
46
  configatron.password = 'PASSWORD'
38
47
 
48
+ If you would like to use proxy server, add configurations like this:
49
+
50
+ configatron.proxy.host = 'PROXYHOST'
51
+ configatron.proxy.port = 'PROXYPORT'
52
+ configatron.proxy.user_name = 'USERNAME'
53
+ configatron.proxy.password = 'PASSWORD'
54
+
39
55
  To update the config, just restart your termtter proccess.
40
56
 
41
57
  == FORUM:
42
58
 
43
59
  http://www.lingr.com/room/termtter
44
60
 
61
+ == DOCUMENT:
62
+
63
+ http://wiki.github.com/jugyo/termtter/home (in Japanese)
64
+
45
65
  == LICENSE:
46
66
 
47
67
  (The MIT License)
data/Rakefile CHANGED
@@ -4,14 +4,15 @@ require File.dirname(__FILE__) + '/lib/termtter'
4
4
  # Generate all the Rake tasks
5
5
  # Run 'rake -T' to see list of generated tasks (from gem root directory)
6
6
  $hoe = Hoe.new('termtter', Termtter::VERSION) do |p|
7
- p.author = ['ujihisa']
8
- p.developer('jugyo', 'jugyo.org@gmail.com')
7
+ p.author = %w[jugyo hakobe motemen koichiro Sixeight mattn ujihisa yanbe hitode909 bubblegum].sort_by{|i|i.downcase}
8
+ p.email = ['jugyo.org@gmail.com']
9
9
  p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
10
10
  p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
11
11
  p.rubyforge_name = p.name # TODO this is default value
12
12
  p.extra_deps = [
13
13
  ['json'],
14
14
  ['configatron'],
15
+ ['highline'],
15
16
  ]
16
17
  #p.extra_dev_deps = [
17
18
  # ['newgem', ">= #{::Newgem::VERSION}"]
data/bin/termtter CHANGED
@@ -3,8 +3,9 @@
3
3
  $KCODE = 'u'
4
4
 
5
5
  require 'rubygems'
6
- require 'termtter'
7
6
  require 'configatron'
7
+ require 'highline'
8
+ require 'termtter'
8
9
  plugin 'standard_plugins'
9
10
  plugin 'stdout'
10
11
 
@@ -12,10 +13,11 @@ conf_file = File.expand_path('~/.termtter')
12
13
  if File.exist? conf_file
13
14
  load conf_file
14
15
  else
15
- print "your twitter username: "
16
- username = gets.chomp
17
- print "your twitter password: "
18
- password = gets.chomp
16
+ HighLine.track_eof = false
17
+ ui = HighLine.new
18
+ username = ui.ask('your twitter username: ')
19
+ password = ui.ask('your twitter password: ') { |q| q.echo = false }
20
+
19
21
  File.open(File.expand_path('~/.termtter'), 'w') {|io|
20
22
  plugins = Dir.glob(File.dirname(__FILE__) + "/../lib/plugin/*.rb").map {|f|
21
23
  f.match(%r|lib/plugin/(.*?).rb$|)[1]
@@ -29,6 +31,10 @@ else
29
31
  io.puts "configatron.user_name = '#{username}'"
30
32
  io.puts "configatron.password = '#{password}'"
31
33
  io.puts "#configatron.update_interval = 120"
34
+ io.puts "#configatron.proxy.host = 'proxy host'"
35
+ io.puts "#configatron.proxy.port = '8080'"
36
+ io.puts "#configatron.proxy.user_name = 'proxy user'"
37
+ io.puts "#configatron.proxy.password = 'proxy password'"
32
38
  io.puts
33
39
  io.puts "# vim: set filetype=ruby"
34
40
  }
@@ -10,6 +10,13 @@ module Termtter::Client
10
10
  end
11
11
 
12
12
  def expand_tinyurl(path)
13
- res = Net::HTTP.new('tinyurl.com').head(path)
13
+ http_class = Net::HTTP
14
+ unless configatron.proxy.host.empty?
15
+ http_class = Net::HTTP::Proxy(configatron.proxy.host,
16
+ configatron.proxy.port,
17
+ configatron.proxy.user_name,
18
+ configatron.proxy.password)
19
+ end
20
+ res = http_class.new('tinyurl.com').head(path)
14
21
  res['Location']
15
22
  end
data/lib/filter/fib.rb ADDED
@@ -0,0 +1,13 @@
1
+ def fib(n)i=0;j=1;n.times{j=i+i=j};i end
2
+ module Termtter::Client
3
+ add_filter do |statuses|
4
+ statuses.each do |s|
5
+ s.text.gsub!(/(\d+)/) do |m|
6
+ n = $1.to_i
7
+ n < 1000000000 ? fib(n) : n # not to calc fib(id)
8
+ end
9
+ end
10
+ statuses
11
+ end
12
+ end
13
+
data/lib/filter/yhara.rb CHANGED
@@ -10,7 +10,7 @@ module Termtter
10
10
 
11
11
  module Client
12
12
  add_filter do |statuses|
13
- statuses.select {|s| s.yharian? }
13
+ statuses.select &:yharian?
14
14
  end
15
15
  end
16
16
  end
@@ -0,0 +1,26 @@
1
+ module Termtter
2
+ class Status
3
+ def bomb?
4
+ /爆発|bomb/ =~ self.text
5
+ end
6
+ end
7
+
8
+ module Client
9
+ add_help 'bomb WORD', 'Bomb it'
10
+ add_command %r'^bomb\s+(.+)$' do |m, t|
11
+ bomb = m[1]
12
+ msg = "#{bomb} 爆発しろ!"
13
+
14
+ puts msg
15
+ t.update_status msg
16
+ end
17
+ end
18
+ end
19
+
20
+ # bomb.rb
21
+ # Bomb it!
22
+ #
23
+ # See http://gyazo.com/4b33517380673d92f51a52e675ecdb02.png .
24
+ # configatron.plugins.stdout.timeline_format =
25
+ # '<%= color(time, 90) %> <%= s.bomb? ? color(color(status, 41), 37) : color(status, status_color) %> <%= color(id, 90) %>'
26
+ # vim: fenc=utf8
@@ -0,0 +1,24 @@
1
+ module Termtter::Client
2
+
3
+ add_command /^confirm\s+(.*)/ do |m, t|
4
+ text = m[1]
5
+ unless text.empty?
6
+ pause
7
+ print "update? #{text} [Y/n] "
8
+ buf = Readline.readline("", false)
9
+ t.update_status(text) if /^y?$/i =~ buf
10
+ resume
11
+ end
12
+ end
13
+
14
+ add_completion do |input|
15
+ case input
16
+ when /^(confirm)\s+(.*)@([^\s]*)$/
17
+ find_user_candidates $3, "#{$1} #{$2}@%s"
18
+ else
19
+ ['confirm'].grep(/^#{Regexp.quote input}/)
20
+ end
21
+ end
22
+
23
+ end
24
+
@@ -1,7 +1,7 @@
1
1
  module Termtter::Client
2
2
  add_help 'favorite,fav ID', 'Favorite a status'
3
3
 
4
- add_command %r'^(?:favorite|fav)\s+(\d+)$' do |m,t|
4
+ add_command %r'^(?:favorite|fav)\s+(\d+)$' do |m, t|
5
5
  id = m[1]
6
6
  res = t.favorite(id)
7
7
  if res.code == '200'
@@ -11,12 +11,28 @@ module Termtter::Client
11
11
  end
12
12
  end
13
13
 
14
+ add_help 'favorite,fav USER', 'Favorite last status on the user'
15
+
16
+ add_command %r'^(?:favorite|fav)\s+@(.+)$' do |m, t|
17
+ user = m[1]
18
+ statuses = t.get_user_timeline(user)
19
+ unless statuses.empty?
20
+ id = statuses[0].id
21
+ res = t.favorite(id)
22
+ if res.code == '200'
23
+ puts "Favorited last status ##{id} on user @#{user}"
24
+ else
25
+ puts "Failed: #{res}"
26
+ end
27
+ end
28
+ end
29
+
14
30
  if public_storage[:log]
15
31
  add_help 'favorite,fav /WORD', 'Favorite a status by searching'
16
32
 
17
- add_command %r'^(?:favorite|fav)\s+/(.+)$' do |m,t|
33
+ add_command %r'^(?:favorite|fav)\s+/(.+)$' do |m, t|
18
34
  pat = Regexp.new(m[1])
19
- statuses = public_storage[:log].select { |s| s.text =~ pat }
35
+ statuses = public_storage[:log].select {|s| pat =~ s.text }
20
36
  if statuses.size == 1
21
37
  status = statuses.first
22
38
  res = t.favorite(status.id)
@@ -32,7 +48,12 @@ module Termtter::Client
32
48
  end
33
49
 
34
50
  add_completion do |input|
35
- %w(favorite).grep(/^#{Regexp.quote input}/)
51
+ case input
52
+ when /^(favorite|fav)?\s+@(.*)/
53
+ find_user_candidates $2, "#{$1} @%s"
54
+ else
55
+ %w(favorite).grep(/^#{Regexp.quote input}/)
56
+ end
36
57
  end
37
58
  end
38
59
 
data/lib/plugin/fib.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  def fib(n)i=0;j=1;n.times{j=i+i=j};i end
2
2
  module Termtter::Client
3
3
  add_command /^fib\s+(\d+)/ do|m,t|t.update_status x="fib(#{n=m[1].to_i}) = #{fib n}"
4
- puts"=> #{x}"end end
4
+ puts"=> #{x}"end
5
+ add_command /^fibyou\s(\w+)\s(\d+)/ do|m,t|puts"=> #{t.update_status("@#{m[1]} fib(#{n=m[2].to_i}) = #{fib n}")}"end end
data/lib/plugin/filter.rb CHANGED
@@ -9,8 +9,6 @@ module Termtter::Client
9
9
  result = filter m[1].strip
10
10
  rescue LoadError
11
11
  result = false
12
- else
13
- public_storage[:filters] << m[1].strip
14
12
  ensure
15
13
  puts "=> #{result.inspect}"
16
14
  end
@@ -63,4 +61,4 @@ end
63
61
  # => true
64
62
  # > list
65
63
  # (15:48:02) termtter: hello
66
-
64
+ # vim: fenc=utf8
@@ -0,0 +1,40 @@
1
+ module Termtter::Client
2
+ add_help 'follow USER', 'Follow user'
3
+ add_help 'leave USER', 'Leave user'
4
+
5
+ add_command %r'^(follow|leave)\s+(\w+)\s*$' do |m, t|
6
+ user = m[2]
7
+ res = t.social(user, m[1].to_sym)
8
+ if res.code == '200'
9
+ puts "#{m[1].capitalize}ed user @#{user}"
10
+ else
11
+ puts "Failed: #{res}"
12
+ end
13
+ end
14
+
15
+ add_completion do |input|
16
+ case input
17
+ when /^(follow|leave)?\s+(.*)/
18
+ find_user_candidates $2, "#{$1} %s"
19
+ else
20
+ %w[follow leave].grep(/^#{Regexp.quote input}/)
21
+ end
22
+ end
23
+ end
24
+
25
+ module Termtter
26
+ class Twitter
27
+ def social(user, type)
28
+ type =
29
+ case type.to_sym
30
+ when :follow then 'create'
31
+ when :leave then 'destroy'
32
+ end
33
+ uri = "http://twitter.com/friendships/#{type}/#{user}.json"
34
+
35
+ Net::HTTP.start('twitter.com', 80) do |http|
36
+ http.request(post_request(uri))
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ configatron.set_default('plugins.group.groups', {})
2
+
3
+ module Termtter::Client
4
+ if public_storage[:log]
5
+ add_help 'group,g GROUPNAME', 'Filter by group members'
6
+
7
+ add_command /^(?:group|g)\s+(.+)/ do |m, t|
8
+ group_name = m[1].to_sym
9
+ group = configatron.plugins.group.groups[group_name]
10
+ statuses = group ? public_storage[:log].select { |s|
11
+ group.include?(s.user_screen_name)
12
+ } : []
13
+ call_hooks(statuses, :list_friends_timeline, t)
14
+ end
15
+
16
+ def self.find_group_candidates(a, b)
17
+ configatron.plugins.group.groups.keys.map {|k| k.to_s}.
18
+ grep(/^#{Regexp.quote a}/).
19
+ map {|u| b % u }
20
+ end
21
+
22
+ add_completion do |input|
23
+ case input
24
+ when /^(group|g)?\s+(.+)/
25
+ find_group_candidates($2, "#{$1} %s")
26
+ when /^(group|g)\s+$/
27
+ configatron.plugins.group.groups.keys
28
+ else
29
+ %w(group).grep(/^#{Regexp.quote input}/)
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ # group.rb
36
+ # plugin 'group'
37
+ # configatron.plugins.group.groups = {
38
+ # :rits => %w(hakobe isano hitode909)
39
+ # }
40
+ # NOTE: group.rb needs plugin/log
@@ -0,0 +1,53 @@
1
+ require 'zlib'
2
+
3
+ configatron.plugins.history.
4
+ set_default('filename', '~/.termtter_history')
5
+ configatron.plugins.history.
6
+ set_default('keys', [:log, :users, :status_ids])
7
+
8
+ module Termtter::Client
9
+ def self.load_history
10
+ filename = File.expand_path(configatron.plugins.history.filename)
11
+ keys = configatron.plugins.history.keys
12
+
13
+ if File.exist?(filename)
14
+ begin
15
+ history = Marshal.load Zlib::Inflate.inflate(File.read(filename))
16
+ rescue Zlib::DataError
17
+ history = Marshal.load File.read(filename)
18
+ end
19
+ if history
20
+ keys.each do |key|
21
+ public_storage[key] = history[key] if history[key]
22
+ end
23
+ puts "history loaded(#{File.size(filename)}bytes)"
24
+ end
25
+ end
26
+ end
27
+
28
+ def self.save_history
29
+ filename = File.expand_path(configatron.plugins.history.filename)
30
+ keys = configatron.plugins.history.keys
31
+ history = { }
32
+ keys.each do |key|
33
+ history[key] = public_storage[key]
34
+ end
35
+
36
+ File.open(filename, 'w') do |f|
37
+ f.write Zlib::Deflate.deflate(Marshal.dump(history))
38
+ end
39
+ puts "history saved(#{File.size(filename)}bytes)"
40
+ end
41
+
42
+ add_hook do |statuses, event|
43
+ case event
44
+ when :initialize
45
+ load_history
46
+ when :exit
47
+ save_history
48
+ end
49
+ end
50
+ end
51
+
52
+ # history.rb
53
+ # save log to file