jugyo-termtter 0.7.6 → 0.7.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,43 @@
1
+ module Termtter::Client
2
+ def self.scrape_group(group, t)
3
+ members = configatron.plugins.group.groups[group] || []
4
+ members.map {|member|
5
+ t.get_user_timeline(member)
6
+ }.flatten
7
+ end
8
+
9
+ def self.scrape_groups(t)
10
+ groups = configatron.plugins.group.groups
11
+ groups.map {|group|
12
+ scrape_group(group, t)
13
+ }.flatten
14
+ end
15
+
16
+ add_help 'scrape_group GROUPNAME', 'Get the group timeline'
17
+ add_help 'scrape_groups', 'Get all groups timeline'
18
+
19
+ add_command /^(?:scrape_group)\s+(.+)/ do |m, t|
20
+ group_name = m[1].to_sym
21
+ statuses = scrape_group(group_name, t)
22
+ call_hooks(statuses, :pre_filter, t)
23
+ puts "done"
24
+ end
25
+
26
+ add_command /^(?:scrape_groups)\s*$/ do |m, t|
27
+ statuses = scrape_groups(t)
28
+ call_hooks(statuses, :pre_filter, t)
29
+ puts "done"
30
+ end
31
+
32
+ add_completion do |input|
33
+ case input
34
+ when /^(scrape_group)?\s+(.+)/
35
+ find_group_candidates($2, "#{$1} %s") if defined? find_group_candidates
36
+ when /^(scrape_group)\s+$/
37
+ configatron.plugins.group.groups.keys
38
+ else
39
+ %w(scrape_group scrape_groups).grep(/^#{Regexp.quote input}/)
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1,22 @@
1
+ module Termtter
2
+ module Plugin
3
+ module Screen
4
+ def self.set_title(title)
5
+ print "\033k#{title}\033\\"
6
+ end
7
+ end
8
+ end
9
+ end
10
+
11
+ # Add below to your ~/.termtter
12
+ #
13
+ # require 'plugin/yonda'
14
+ # require 'plugin/screen'
15
+ # module Termtter::Client
16
+ # add_hook do |statuses, event|
17
+ # case event
18
+ # when :update_friends_timeline, :plugin_yonda_yonda
19
+ # Termtter::Plugin::Screen::set_title("termtter(#{public_storage[:unread_count]})")
20
+ # end
21
+ # end
22
+ # end
data/lib/plugin/shell.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Termtter::Client
2
2
  add_help 'shell,sh', 'Start your shell'
3
- add_macro /^(?:shell|sh)/, "eval system ENV['SHELL'] || ENV['COMSPEC']"
3
+ add_macro /^(?:shell|sh)\s*$/, "eval system ENV['SHELL'] || ENV['COMSPEC']"
4
4
  end
data/lib/plugin/sl.rb CHANGED
@@ -12,20 +12,20 @@ module Termtter::Client
12
12
  end
13
13
 
14
14
  add_help 'cd USER', 'Change current directory'
15
- add_command /^cd\s+(.*)/ do |m, t|
15
+ add_command /^(?:cd\s+|\.\/)(.*)/ do |m, t|
16
16
  directory = m[1].strip
17
- direcroty = '' if /~/ =~ direcroty
18
- public_storage[:current] = direcroty
19
- puts "=> #{direcroty}"
17
+ directory = '' if /\~/ =~ directory
18
+ public_storage[:current] = directory
19
+ puts "=> #{directory}"
20
20
  end
21
21
  add_macro /^cd$/, 'eval public_storage[:current] = ""'
22
22
 
23
23
  add_completion do |input|
24
24
  case input
25
- when /^(cd)\s+(.*)/
26
- find_user_candidates $2, "#{$1} %s"
25
+ when /^(cd\s+|\.\/)(.*)/
26
+ find_user_candidates $2, "#{$1.gsub(/\s+/, ' ')}%s"
27
27
  else
28
- %w[ sl ls cd pwd ].grep(/^#{Regexp.quote input}/)
28
+ %w[ sl ls cd pwd ./ ].grep(/^#{Regexp.quote input}/)
29
29
  end
30
30
  end
31
31
  end
@@ -1,15 +1,35 @@
1
+ require 'erb'
2
+
1
3
  module Termtter::Client
2
4
 
3
5
  # standard commands
4
6
 
5
7
  add_command /^(update|u)\s+(.*)/ do |m, t|
6
- text = m[2]
8
+ text = ERB.new(m[2]).result(binding).gsub(/\n/, ' ')
7
9
  unless text.empty?
8
10
  t.update_status(text)
9
11
  puts "=> #{text}"
10
12
  end
11
13
  end
12
14
 
15
+ add_command /^(direct|d)\s+([^\s]+)\s+(.*)\s*$/ do |m, t|
16
+ user = m[2]
17
+ text = ERB.new(m[3]).result(binding).gsub(/\n/, ' ')
18
+ unless text.empty?
19
+ t.direct_message(user, text)
20
+ puts "=> to:#{user} message:#{text}"
21
+ end
22
+ end
23
+
24
+ add_command /^(profile|p)\s+([^\s]+)/ do |m, t|
25
+ profile = t.get_user_profile(m[2])
26
+ if profile
27
+ %w[ name favourites_count url id description protected utc_offset time_zone screen_name notifications statuses_count followers_count friends_count profile_image_url location following created_at ].each do |key|
28
+ puts "#{key} : #{profile[key]}" if profile.key?(key)
29
+ end
30
+ end
31
+ end
32
+
13
33
  add_command /^(list|l)\s*$/ do |m, t|
14
34
  statuses = t.get_friends_timeline()
15
35
  call_hooks(statuses, :list_friends_timeline, t)
@@ -28,45 +48,63 @@ module Termtter::Client
28
48
  call_hooks(t.replies(), :replies, t)
29
49
  end
30
50
 
31
- add_command /^show\s+([^\s]+)/ do |m, t|
32
- call_hooks(t.show(m[1]), :show, t)
51
+ add_command /^show(s)?\s+(?:[\w\d]+:)?(\d+)/ do |m, t|
52
+ call_hooks(t.show(m[2], m[1]), :show, t)
33
53
  end
34
54
 
35
55
  # TODO: Change colors when remaining_hits is low.
36
56
  # TODO: Simmulate remaining_hits.
37
- add_command /^(limit|lm)\s*$/ do |m, t|
38
- limit = t.get_rate_limit_status
39
- puts "=> #{limit.remaining_hits}/#{limit.hourly_limit}"
40
- end
41
-
42
-
43
- add_command /^pause\s*$/ do |m, t|
44
- pause
45
- end
46
-
47
- add_command /^resume\s*$/ do |m, t|
48
- resume
49
- end
50
-
51
- add_command /^(exit|e)\s*$/ do |m, t|
52
- exit
53
- end
54
-
55
- add_command /^help\s*$/ do |m, t|
56
- puts <<-EOS
57
- exit,e Exit
58
- help Print this help message
59
- list,l List the posts in your friends timeline
60
- list,l USERNAME List the posts in the the given user's timeline
61
- limit,lm Show the API limit status
62
- pause Pause updating
63
- update,u TEXT Post a new message
64
- resume Resume updating
65
- replies,r List the most recent @replies for the authenticating user
66
- search,s TEXT Search for Twitter
67
- show ID Show a single status
68
- EOS
69
- puts formatted_help unless @@helps.empty?
57
+ register_command(
58
+ :name => :limit, :aliases => ['lm'],
59
+ :exec_proc => proc {|arg|
60
+ limit = Termtter::API.twitter.get_rate_limit_status
61
+ remaining_time = "%dmin %dsec" % (limit.reset_time - Time.now).divmod(60)
62
+ remaining_color =
63
+ case limit.remaining_hits / limit.hourly_limit.to_f
64
+ when 0.2..0.4 then :yellow
65
+ when 0..0.2 then :red
66
+ else :green
67
+ end
68
+ puts "=> #{color(limit.remaining_hits, remaining_color)}/#{limit.hourly_limit} until #{limit.reset_time} (#{remaining_time} remaining)"
69
+ },
70
+ :help => ["limit,lm", "Show the API limit status"]
71
+ )
72
+
73
+ register_command(
74
+ :name => :pause,
75
+ :exec_proc => proc {|arg| pause},
76
+ :help => ["pause", "Pause updating"]
77
+ )
78
+
79
+ register_command(
80
+ :name => :resume,
81
+ :exec_proc => proc {|arg| resume},
82
+ :help => ["resume", "Resume updating"]
83
+ )
84
+
85
+ register_command(
86
+ :name => :exit, :aliases => ['e'],
87
+ :exec_proc => proc {|arg| exit},
88
+ :help => ['exit,e', 'Exit']
89
+ )
90
+
91
+ add_command /^(help|h)\s*$/ do |m, t|
92
+ # TODO: migrate to use Termtter::Command#help
93
+ helps = [
94
+ ["help,h", "Print this help message"],
95
+ ["list,l", "List the posts in your friends timeline"],
96
+ ["list,l USERNAME", "List the posts in the the given user's timeline"],
97
+ ["update,u TEXT", "Post a new message"],
98
+ ["direct,d @USERNAME TEXT", "Send direct message"],
99
+ ["profile,p USERNAME", "Show user's profile"],
100
+ ["replies,r", "List the most recent @replies for the authenticating user"],
101
+ ["search,s TEXT", "Search for Twitter"],
102
+ ["show ID", "Show a single status"]
103
+ ]
104
+ helps += @@helps
105
+ helps += @@new_commands.map {|name, command| command.help}
106
+ helps.compact!
107
+ puts formatted_help(helps)
70
108
  end
71
109
 
72
110
  add_command /^eval\s+(.*)$/ do |m, t|
@@ -90,13 +128,13 @@ show ID Show a single status
90
128
  end
91
129
  end
92
130
 
93
- def self.formatted_help
94
- width = @@helps.map {|n, d| n.size }.max
131
+ def self.formatted_help(helps)
132
+ helps = helps.sort_by{|help| help[0]}
133
+ width = helps.map {|n, d| n.size }.max
95
134
  space = 3
96
- "\nuser commands:\n" +
97
- @@helps.map {|name, desc|
98
- name.to_s.ljust(width + space) + desc.to_s
99
- }.join("\n")
135
+ helps.map {|name, desc|
136
+ name.to_s.ljust(width + space) + desc.to_s
137
+ }.join("\n")
100
138
  end
101
139
 
102
140
  # completion for standard commands
@@ -114,11 +152,15 @@ show ID Show a single status
114
152
  end
115
153
  end
116
154
 
117
- def self.find_status_id_candidates(a, b)
155
+ def self.find_status_id_candidates(a, b, u = nil)
156
+ candidates = public_storage[:status_ids].to_a
157
+ if u && c = public_storage[:log].select {|s| s.user_screen_name == u }.map {|s| s.id.to_s }
158
+ candidates = c unless c.empty?
159
+ end
118
160
  if a.empty?
119
- public_storage[:status_ids].to_a
161
+ candidates
120
162
  else
121
- public_storage[:status_ids].grep(/#{Regexp.quote a}/)
163
+ candidates.grep(/#{Regexp.quote a}/)
122
164
  end.
123
165
  map {|u| b % u }
124
166
  end
@@ -133,14 +175,24 @@ show ID Show a single status
133
175
  end
134
176
 
135
177
  add_completion do |input|
136
- standard_commands = %w[exit help list pause update resume replies search show limit]
178
+ standard_commands = %w[exit help list pause profile update direct resume replies search show limit]
137
179
  case input
138
180
  when /^(list|l)?\s+(.*)/
139
181
  find_user_candidates $2, "#{$1} %s"
140
182
  when /^(update|u)\s+(.*)@([^\s]*)$/
141
183
  find_user_candidates $3, "#{$1} #{$2}@%s"
142
- when /^show\s+(.*)/
143
- find_status_id_candidates $1, "show %s"
184
+ when /^(direct|d)\s+(.*)/
185
+ find_user_candidates $2, "#{$1} %s"
186
+ when /^(profile|p)\s+(.*)/
187
+ find_user_candidates $2, "#{$1} %s"
188
+ when /^show(s)?\s+(([\w\d]+):)?\s*(.*)/
189
+ if $2
190
+ find_status_id_candidates $4, "show#{$1} #{$2}%s", $3
191
+ else
192
+ result = find_user_candidates $4, "show#{$1} %s:"
193
+ result = find_status_id_candidates $4, "show#{$1} %s" if result.empty?
194
+ result
195
+ end
144
196
  else
145
197
  standard_commands.grep(/^#{Regexp.quote input}/)
146
198
  end
data/lib/plugin/stdout.rb CHANGED
@@ -3,53 +3,15 @@ require 'erb'
3
3
 
4
4
  configatron.plugins.stdout.set_default(
5
5
  :colors,
6
- [:white, :red, :green, :yellow, :blue, :magenta, :cyan])
6
+ [:none, :red, :green, :yellow, :blue, :magenta, :cyan])
7
7
  configatron.plugins.stdout.set_default(
8
8
  :timeline_format,
9
9
  '<%= color(time, 90) %> <%= color(status, status_color) %> <%= color(id, 90) %>')
10
10
 
11
11
  $highline = HighLine.new
12
12
 
13
- if win?
14
- require 'kconv'
15
- require 'Win32API'
16
- STD_OUTPUT_HANDLE = 0xFFFFFFF5
17
- $wSetConsoleTextAttribute = Win32API.new('kernel32','SetConsoleTextAttribute','II','I')
18
- $wGetConsoleScreenBufferInfo = Win32API.new("kernel32", "GetConsoleScreenBufferInfo", ['l', 'p'], 'i')
19
- $wGetStdHandle = Win32API.new('kernel32','GetStdHandle','I','I')
20
-
21
- $hStdOut = $wGetStdHandle.call(STD_OUTPUT_HANDLE)
22
- lpBuffer = ' ' * 22
23
- $wGetConsoleScreenBufferInfo.call($hStdOut, lpBuffer)
24
- $oldColor = lpBuffer.unpack('SSSSSssssSS')[4]
25
-
26
- $colorMap = {
27
- 0 => 7, # black/white
28
- 37 => 8, # white/intensity
29
- 31 => 4 + 8, # red/red
30
- 32 => 2 + 8, # green/green
31
- 33 => 6 + 8, # yellow/yellow
32
- 34 => 1 + 8, # blue/blue
33
- 35 => 5 + 8, # magenta/purple
34
- 36 => 3 + 8, # cyan/aqua
35
- 90 => 7, # erase/white
36
- }
37
- def puts(str)
38
- str = str.tosjis
39
- tokens = str.split(/(\e\[\d+m)/)
40
- tokens.each do |token|
41
- if token =~ /\e\[(\d+)m/
42
- $wSetConsoleTextAttribute.call $hStdOut, $colorMap[$1.to_i].to_i
43
- else
44
- STDOUT.print token
45
- end
46
- end
47
- $wSetConsoleTextAttribute.call $hStdOut, $oldColor
48
- STDOUT.puts
49
- end
50
- end
51
-
52
13
  def color(str, value)
14
+ return str if value == :none
53
15
  case value
54
16
  when String, Symbol
55
17
  $highline.color(str, value)
@@ -58,47 +20,41 @@ def color(str, value)
58
20
  end
59
21
  end
60
22
 
61
- Termtter::Client.add_hook do |statuses, event|
62
- case event
63
- when :update_friends_timeline, :list_friends_timeline, :list_user_timeline, :show, :replies
64
- unless statuses.empty?
65
- statuses.reverse! if event == :update_friends_timeline
66
- statuses.each do |s|
67
- text = s.text
68
- status_color = configatron.plugins.stdout.colors[s.user_screen_name.hash % configatron.plugins.stdout.colors.size]
69
- status = "#{s.user_screen_name}: #{text}"
70
- if s.in_reply_to_status_id
71
- status += " (reply to #{s.in_reply_to_status_id})"
72
- end
73
-
74
- time_format = case event
75
- when :update_friends_timeline, :list_friends_timeline
76
- '%H:%M:%S'
77
- else
78
- '%m-%d %H:%M'
79
- end
80
- time = "(#{s.created_at.strftime(time_format)})"
81
-
82
- id = s.id
23
+ module Termtter::Client
83
24
 
84
- puts ERB.new(configatron.plugins.stdout.timeline_format).result(binding)
85
- end
86
- end
87
- when :search
88
- statuses.each do |s|
25
+ def self.print_statuses(statuses, sort = true, time_format = '%H:%M:%S')
26
+ (sort ? statuses.sort_by{ |s| s.id} : statuses).each do |s|
89
27
  text = s.text
90
28
  status_color = configatron.plugins.stdout.colors[s.user_screen_name.hash % configatron.plugins.stdout.colors.size]
91
-
92
29
  status = "#{s.user_screen_name}: #{text}"
93
- time = "(#{s.created_at.strftime('%m-%d %H:%M')})"
30
+ if s.in_reply_to_status_id
31
+ status += " (reply to #{s.in_reply_to_status_id})"
32
+ end
33
+
34
+ time = "(#{s.created_at.strftime(time_format)})"
94
35
  id = s.id
95
36
  puts ERB.new(configatron.plugins.stdout.timeline_format).result(binding)
96
37
  end
97
38
  end
98
- end
99
39
 
40
+ def self.print_statuses_with_date(statuses, sort = true)
41
+ print_statuses(statuses, sort, '%m-%d %H:%M')
42
+ end
43
+
44
+ add_hook do |statuses, event|
45
+ next if statuses.empty?
46
+
47
+ case event
48
+ when :update_friends_timeline, :list_friends_timeline
49
+ print_statuses(statuses)
50
+ when :search, :list_user_timeline, :show, :replies
51
+ print_statuses_with_date(statuses)
52
+ end
53
+ end
54
+
55
+ end
100
56
  # stdout.rb
101
57
  # output statuses to stdout
102
58
  # example config
103
- # configatron.plugins.stdout.colors = [:white, :red, :green, :yellow, :blue, :magenta, :cyan]
59
+ # configatron.plugins.stdout.colors = [:none, :red, :green, :yellow, :blue, :magenta, :cyan]
104
60
  # configatron.plugins.stdout.timeline_format = '<%= color(time, 90) %> <%= color(status, status_color) %> <%= color(id, 90) %>'
@@ -0,0 +1,41 @@
1
+ require 'erb'
2
+
3
+ configatron.plugins.system_status.set_default(:default_status_proc, proc { Time.now.strftime("%x %X") })
4
+ configatron.plugins.system_status.set_default(:interval, 1)
5
+ configatron.plugins.system_status.set_default(:default_color, :on_blue)
6
+ configatron.plugins.system_status.set_default(:format, '<%= status %>')
7
+
8
+ def out_put_status(status, color)
9
+ formatted_status = ERB.new(configatron.plugins.system_status.format).result(binding)
10
+ colored_status = color(formatted_status, color)
11
+ print "\e[s\e[1000G\e[#{status.size - 1}D#{colored_status}\e[u"
12
+ $stdout.flush
13
+ end
14
+
15
+ module Termtter::Client
16
+ Thread.new do
17
+ loop do
18
+ begin
19
+ status = public_storage[:system_status] ||
20
+ configatron.plugins.system_status.default_status_proc.call
21
+ color = public_storage[:system_status_color] ||
22
+ configatron.plugins.system_status.default_color
23
+ rescue => e
24
+ status = e.message
25
+ color = :on_red
26
+ end
27
+ out_put_status(status, color)
28
+ sleep configatron.plugins.system_status.interval
29
+ end
30
+ end
31
+ end
32
+
33
+ # system_status.rb
34
+ # show system status on left side.
35
+ # output public_storage[:system_status] or Time.now.strftime("%x %X") if nil
36
+ # example config
37
+ # configatron.plugins.system_status.default_status_proc = proc { Time.now.strftime("%x %X") }
38
+ # configatron.plugins.system_status.interval = 1
39
+ # configatron.plugins.system_status.default_color = :on_blue
40
+ # configatron.plugins.system_status.format = '<%= status %>'
41
+
@@ -0,0 +1,53 @@
1
+ require 'tempfile'
2
+
3
+ module Termtter::Client
4
+ if ENV['EDITOR']
5
+ configatron.plugins.update_editor.set_default('editor', ENV['EDITOR'])
6
+ else
7
+ configatron.plugins.update_editor.set_default('editor', 'vi')
8
+ end
9
+ configatron.plugins.update_editor.set_default('add_completion', false)
10
+
11
+
12
+ def self.input_editor
13
+ file = Tempfile.new('termtter')
14
+ editor = configatron.plugins.update_editor.editor
15
+ if configatron.plugins.update_editor.add_completion
16
+ file.puts "\n"*100 + "__END__\n" + public_storage[:users].to_a.join(' ')
17
+ end
18
+ file.close
19
+ system("#{editor} #{file.path}")
20
+ result = file.open.read
21
+ file.close(false)
22
+ result
23
+ end
24
+
25
+ add_command /^(update_editor|ue)\s*$/ do |m, t|
26
+ pause
27
+ text = input_editor
28
+ unless text.empty?
29
+ text = ERB.new(text).result(binding)
30
+ text.split("\n").each do |post|
31
+ break if post =~ /^__END__$/
32
+ unless post.empty?
33
+ t.update_status(post)
34
+ puts "=> #{post}"
35
+ end
36
+ end
37
+ end
38
+ resume
39
+ end
40
+
41
+ add_help 'update_editor,ue', 'Update status from editor.'
42
+
43
+ add_completion do |input|
44
+ %w[ update_editor ].grep(/^#{Regexp.quote input}/)
45
+ end
46
+ end
47
+
48
+ # update_editor.rb
49
+ # update status from editor.
50
+ # example:
51
+ # > update_editor
52
+ # (type your status, save, close the editor)
53
+ # => (your status)
@@ -0,0 +1,21 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+
4
+ module Termtter::Client
5
+ # NOTE: overwrite original update command
6
+ add_command /^(update|u)\s+(.*)/ do |m, t|
7
+ text = ERB.new(m[2]).result(binding).gsub(/\n/, ' ')
8
+ t.update_status(text)
9
+ puts "=> #{text}"
10
+ begin
11
+ Net::HTTP.version_1_2
12
+ req = Net::HTTP::Post.new("/statuses/update.json?")
13
+ req.basic_auth configatron.plugins.wassr_post.username, configatron.plugins.wassr_post.password
14
+ Net::HTTP.start('api.wassr.jp', 80) do |http|
15
+ res = http.request(req, "status=#{URI.escape(text)}&source=Termtter")
16
+ end
17
+ rescue
18
+ puts "RuntimeError: #{$!}"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ module Termtter::Client
2
+ public_storage[:unread_count] = 0
3
+
4
+ add_help 'yonda,y', 'Mark as read'
5
+
6
+ add_command %r'^y(?:onda)?\s*$' do |m, t|
7
+ public_storage[:unread_count] = 0
8
+ print "\033[2J\033[H" # FIXME
9
+ call_hooks [], :plugin_yonda_yonda, t
10
+ end
11
+
12
+ add_hook do |statuses, event|
13
+ case event
14
+ when :update_friends_timeline
15
+ public_storage[:unread_count] += statuses.size
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,12 @@
1
+ module Termtter
2
+ module API
3
+ class << self
4
+ attr_reader :connection, :twitter
5
+ def setup
6
+ @connection = Connection.new
7
+ @twitter = Termtter::Twitter.new(configatron.user_name, configatron.password, @connection)
8
+ end
9
+ end
10
+ end
11
+ end
12
+ # Termtter::API.connection, Termtter::API.twitter can be accessed.