jugyo-termtter 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -4,6 +4,7 @@ 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']
7
8
  p.developer('jugyo', 'jugyo.org@gmail.com')
8
9
  p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
9
10
  p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
data/bin/termtter CHANGED
@@ -12,14 +12,26 @@ conf_file = File.expand_path('~/.termtter')
12
12
  if File.exist? conf_file
13
13
  load conf_file
14
14
  else
15
- puts <<EOS
16
- The configuration file does not exist.
17
- Example:
18
- # ~/.termtter
19
- configatron.user_name = 'USERNAME'
20
- configatron.password = 'PASSWORD'
21
- EOS
22
- exit 1
15
+ print "your twitter username: "
16
+ username = gets.chomp
17
+ print "your twitter password: "
18
+ password = gets.chomp
19
+ File.open(File.expand_path('~/.termtter'), 'w') {|io|
20
+ plugins = Dir.glob(File.dirname(__FILE__) + "/../lib/plugin/*.rb").map {|f|
21
+ f.match(%r|lib/plugin/(.*?).rb$|)[1]
22
+ }
23
+ plugins -= %w[stdout standard_commands]
24
+ plugins.each do |p|
25
+ io.puts "#plugin '#{p}'"
26
+ end
27
+
28
+ io.puts "configatron.user_name = 'USERNAME'"
29
+ io.puts "configatron.password = 'PASSWORD'"
30
+ io.puts
31
+ io.puts "# vim: set filetype=ruby"
32
+ }
33
+ puts "generated: ~/.termtter"
34
+ puts "enjoy!"
23
35
  end
24
36
 
25
37
  Termtter::Client.run
@@ -0,0 +1,58 @@
1
+ require 'set'
2
+
3
+ module Termtter::Client
4
+
5
+ public_storage[:users] ||= Set.new
6
+
7
+ add_hook do |statuses, event, t|
8
+ if !statuses.empty?
9
+ case event
10
+ when :update_friends_timeline, :replies, :list_user_timeline
11
+ statuses.each do |s|
12
+ public_storage[:users].add(s.user_screen_name)
13
+ s.text.scan(/@[a-zA-Z_0-9]*/).each do |u| # reply
14
+ public_storage[:users].add(u.gsub("@","")) unless u == "@"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ end
22
+
23
+ module Termtter
24
+ module InputCompletor
25
+
26
+ Commands = %w[exit help list pause update resume replies search show uri-open]
27
+
28
+ def self.find_candidates(a, b)
29
+ if a.empty?
30
+ Termtter::Client.public_storage[:users].to_a
31
+ else
32
+ Termtter::Client.public_storage[:users].
33
+ grep(/^#{Regexp.quote a}/i).map {|u| b % u }
34
+ end
35
+ end
36
+
37
+ CompletionProc = proc {|input|
38
+ case input
39
+ when /^l(ist)? +(.*)/
40
+ find_candidates $2, "list %s"
41
+ when /^(update|u)\s+(.*)@([^\s]*)$/
42
+ find_candidates $3, "#{$1} #{$2}@%s"
43
+ when /^uri-open +(.*)/
44
+ find_candidates $1, "uri-open %s"
45
+ else
46
+ Commands.grep(/^#{Regexp.quote input}/)
47
+ end
48
+ }
49
+
50
+ end
51
+ end
52
+
53
+ Readline.basic_word_break_characters= "\t\n\"\\'`><=;|&{("
54
+ Readline.completion_proc = Termtter::InputCompletor::CompletionProc
55
+
56
+ # author: bubbles
57
+ #
58
+ # see also: http://d.hatena.ne.jp/bubbles/20090105/1231145823
@@ -0,0 +1,51 @@
1
+ Termtter::Client.clear_hooks # FIXME: not to clear all but to clear just stdout.rb
2
+
3
+ # english? :: String -> Boolean
4
+ def english?(message)
5
+ /[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+/ !~ message
6
+ end
7
+
8
+ # FIXME: The code below is a copy from stdout.rb so it's not DRY. DRY it.
9
+ Termtter::Client.add_hook do |statuses, event|
10
+ colors = %w(0 31 32 33 34 35 36 91 92 93 94 95 96)
11
+
12
+ case event
13
+ when :update_friends_timeline, :list_friends_timeline, :list_user_timeline, :show, :replies
14
+ unless statuses.empty?
15
+ if event == :update_friends_timeline then statuses = statuses.reverse end
16
+ statuses.each do |s|
17
+ text = s.text.gsub("\n", '')
18
+ next unless english?(text) # if you substitute "if" for "unless", this script will be "japanese.rb"
19
+ color_num = colors[s.user_screen_name.hash % colors.size]
20
+ status = "#{s.user_screen_name}: #{text}"
21
+ if s.in_reply_to_status_id
22
+ status += " (reply to #{s.in_reply_to_status_id})"
23
+ end
24
+
25
+ case event
26
+ when :update_friends_timeline, :list_friends_timeline
27
+ time_format = '%H:%M:%S'
28
+ else
29
+ time_format = '%m-%d %H:%d'
30
+ end
31
+ time_str = "(#{s.created_at.strftime(time_format)})"
32
+
33
+ puts "#{color(time_str, 90)} #{color(status, color_num)}"
34
+ end
35
+ end
36
+ when :search
37
+ statuses.each do |s|
38
+ text = s.text.gsub("\n", '')
39
+ color_num = colors[s.user_screen_name.hash % colors.size]
40
+ status = "#{s.user_screen_name}: #{text}"
41
+ time_str = "(#{s.created_at.strftime('%m-%d %H:%d')})"
42
+
43
+ puts "#{color(time_str, 90)} #{color(status, color_num)}"
44
+ end
45
+ end
46
+ end
47
+
48
+ # USAGE:
49
+ # Write the line on the *first line* of your ~/.termtter
50
+ # plugin 'english'
51
+ # (english.rb will destroy plugins which were required before)
@@ -0,0 +1,7 @@
1
+ Termtter::Client.add_hook do |statuses, event|
2
+ if !statuses.empty? && event == :update_friends_timeline
3
+ statuses.each do |s|
4
+ system 'growlnotify', 'Termtter', '-m', "#{s.user_screen_name}: #{s.text}", '-n', 'termtter'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ Termtter::Client.add_hook do |statuses, event|
2
+ if !statuses.empty? && event == :update_friends_timeline
3
+ max = 10
4
+
5
+ text = statuses.take(max).map {|s|
6
+ status_text = CGI.escapeHTML(s.text)
7
+ status_text.gsub!(%r{https?://[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+},'<a href="\0">\0</a>')
8
+ status_text.gsub!("\n", '')
9
+ "<b>#{s.user_screen_name}:</b> <span font=\"9.0\">#{status_text}</span>"
10
+ }.join("\n")
11
+
12
+ text << %Q|\n<a href="http://twitter.com/">more...</a>| if statuses.size > max
13
+
14
+ system 'notify-send', 'Termtter', text, '-t', '60000'
15
+ end
16
+ end
data/lib/plugin/say.rb ADDED
@@ -0,0 +1,22 @@
1
+ raise 'say.rb runs only in OSX Leopard' if /darwin9/ !~ RUBY_PLATFORM
2
+
3
+ # say :: String -> String -> IO ()
4
+ def say(who, what)
5
+ voices = %w(Alex Bruce Fred Junior Ralph Agnes Kathy Princess Vicki Victoria Albert Bad\ News Bahh Bells Boing Bubbles Cellos Deranged Good\ News Hysterical Pipe\ Organ Trinoids Whisper Zarvox)
6
+ voice = voices[who.hash % voices.size]
7
+ system 'say', '-v', voice, what
8
+ end
9
+
10
+ module Termtter::Client
11
+ add_hook do |statuses, event, t|
12
+ if !statuses.empty? && event == :update_friends_timeline
13
+ statuses.reverse.each do |s|
14
+ text_without_uri = s.text.gsub(%r|https?://[^\s]+|, 'U.R.I.')
15
+ say s.user_screen_name, text_without_uri
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ # KNOWN BUG:
22
+ # * exit or <C-c> doen't work quickly.
@@ -0,0 +1,69 @@
1
+ module Termtter::Client
2
+
3
+ add_command /^(update|u)\s+(.*)/ do |m, t|
4
+ text = m[2]
5
+ unless text.empty?
6
+ t.update_status(text)
7
+ puts "=> #{text}"
8
+ end
9
+ end
10
+
11
+ add_command /^(list|l)\s*$/ do |m, t|
12
+ statuses = t.get_friends_timeline()
13
+ call_hooks(statuses, :list_friends_timeline, t)
14
+ end
15
+
16
+ add_command /^(list|l)\s+([^\s]+)/ do |m, t|
17
+ statuses = t.get_user_timeline(m[2])
18
+ call_hooks(statuses, :list_user_timeline, t)
19
+ end
20
+
21
+ add_command /^(search|s)\s+(.+)/ do |m, t|
22
+ call_hooks(t.search(m[2]), :search, t)
23
+ end
24
+
25
+ add_command /^(replies|r)\s*$/ do |m, t|
26
+ call_hooks(t.replies(), :replies, t)
27
+ end
28
+
29
+ add_command /^show\s+([^\s]+)/ do |m, t|
30
+ call_hooks(t.show(m[1]), :show, t)
31
+ end
32
+
33
+ add_command /^pause\s*$/ do |m, t|
34
+ pause
35
+ end
36
+
37
+ add_command /^resume\s*$/ do |m, t|
38
+ resume
39
+ end
40
+
41
+ add_command /^exit\s*$/ do |m, t|
42
+ exit
43
+ end
44
+
45
+ add_command /^help\s*$/ do |m, t|
46
+ puts <<-EOS
47
+ exit Exit
48
+ help Print this help message
49
+ list,l List the posts in your friends timeline
50
+ list,l USERNAME List the posts in the the given user's timeline
51
+ pause Pause updating
52
+ update,u TEXT Post a new message
53
+ resume Resume updating
54
+ replies,r List the most recent @replies for the authenticating user
55
+ search,s TEXT Search for Twitter
56
+ show ID Show a single status
57
+ EOS
58
+ end
59
+
60
+ add_command /^eval\s+(.*)$/ do |m, t|
61
+ begin
62
+ result = eval(m[1]) unless m[1].empty?
63
+ puts "=> #{result.inspect}"
64
+ rescue SyntaxError => e
65
+ puts e
66
+ end
67
+ end
68
+
69
+ end
@@ -0,0 +1,41 @@
1
+ def color(str, num)
2
+ "\e[#{num}m#{str}\e[0m"
3
+ end
4
+
5
+ Termtter::Client.add_hook do |statuses, event|
6
+ colors = %w(0 31 32 33 34 35 36 91 92 93 94 95 96)
7
+
8
+ case event
9
+ when :update_friends_timeline, :list_friends_timeline, :list_user_timeline, :show, :replies
10
+ unless statuses.empty?
11
+ if event == :update_friends_timeline then statuses = statuses.reverse end
12
+ statuses.each do |s|
13
+ text = s.text.gsub("\n", '')
14
+ color_num = colors[s.user_screen_name.hash % colors.size]
15
+ status = "#{s.user_screen_name}: #{text}"
16
+ if s.in_reply_to_status_id
17
+ status += " (reply to #{s.in_reply_to_status_id})"
18
+ end
19
+
20
+ case event
21
+ when :update_friends_timeline, :list_friends_timeline
22
+ time_format = '%H:%M:%S'
23
+ else
24
+ time_format = '%m-%d %H:%d'
25
+ end
26
+ time_str = "(#{s.created_at.strftime(time_format)})"
27
+
28
+ puts "#{color(time_str, 90)} #{color(status, color_num)}"
29
+ end
30
+ end
31
+ when :search
32
+ statuses.each do |s|
33
+ text = s.text.gsub("\n", '')
34
+ color_num = colors[s.user_screen_name.hash % colors.size]
35
+ status = "#{s.user_screen_name}: #{text}"
36
+ time_str = "(#{s.created_at.strftime('%m-%d %H:%d')})"
37
+
38
+ puts "#{color(time_str, 90)} #{color(status, color_num)}"
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,39 @@
1
+ module Termtter::Client
2
+ public_storage[:uris] = []
3
+
4
+ add_hook do |statuses, event, t|
5
+ if !statuses.empty? && event == :update_friends_timeline
6
+ statuses.each do |s|
7
+ public_storage[:uris] += s.text.scan(%r|https?://[^\s]+|)
8
+ end
9
+ end
10
+ end
11
+
12
+ add_command /^uri-open\s*$/ do |m, t|
13
+ public_storage[:uris].each do |uri|
14
+ # FIXME: works only in OSX and other *NIXs
15
+ if /linux/ =~ RUBY_PLATFORM
16
+ system 'firefox', uri
17
+ else
18
+ system 'open', uri
19
+ end
20
+ end
21
+ public_storage[:uris].clear
22
+ end
23
+
24
+ add_command /^uri-open\s+list\s*$/ do |m, t|
25
+ puts public_storage[:uris]
26
+ end
27
+
28
+ add_command /^uri-open\s+clear\s*$/ do |m, t|
29
+ public_storage[:uris].clear
30
+ puts "clear uris"
31
+ end
32
+ end
33
+ # ~/.termtter
34
+ # plugin 'uri-open'
35
+ #
36
+ # see also: http://ujihisa.nowa.jp/entry/c3dd00c4e0
37
+ #
38
+ # KNOWN BUG
39
+ # * In Debian, exit or C-c in the termtter kills your firefox.
data/lib/termtter.rb CHANGED
@@ -16,8 +16,19 @@ def plugin(s)
16
16
  require "plugin/#{s}"
17
17
  end
18
18
 
19
+ # FIXME: delete this method after the major version up
20
+ alias original_require require
21
+ def require(s)
22
+ if %r|^termtter/(.*)| =~ s
23
+ puts "[WARNING] use plugin '#{$1}' instead of require"
24
+ original_require "plugin/#{$1}"
25
+ else
26
+ original_require s
27
+ end
28
+ end
29
+
19
30
  module Termtter
20
- VERSION = '0.5.4'
31
+ VERSION = '0.5.5'
21
32
 
22
33
  class Twitter
23
34
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jugyo-termtter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - jugyo
@@ -62,14 +62,14 @@ files:
62
62
  - example_dot_termtter
63
63
  - bin/termtter
64
64
  - lib/termtter.rb
65
- - lib/termtter/stdout.rb
66
- - lib/termtter/notify-send.rb
67
- - lib/termtter/standard_commands.rb
68
- - lib/termtter/uri-open.rb
69
- - lib/termtter/growl.rb
70
- - lib/termtter/say.rb
71
- - lib/termtter/english.rb
72
- - lib/termtter/completion.rb
65
+ - lib/plugin/stdout.rb
66
+ - lib/plugin/notify-send.rb
67
+ - lib/plugin/standard_commands.rb
68
+ - lib/plugin/uri-open.rb
69
+ - lib/plugin/growl.rb
70
+ - lib/plugin/say.rb
71
+ - lib/plugin/english.rb
72
+ - lib/plugin/completion.rb
73
73
  - test/test_termtter.rb
74
74
  - test/friends_timeline.json
75
75
  - test/search.json