jugyo-termtter 0.8.14 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +8 -8
- data/Rakefile +3 -5
- data/lib/{plugin → plugins}/april_fool.rb +0 -0
- data/lib/plugins/bomb.rb +42 -0
- data/lib/{plugin → plugins}/clear.rb +0 -0
- data/lib/{plugin → plugins}/confirm.rb +0 -0
- data/lib/{plugin → plugins}/cool.rb +0 -0
- data/lib/{plugin → plugins}/devel.rb +0 -0
- data/lib/{filter → plugins}/en2ja.rb +1 -1
- data/lib/plugins/english.rb +25 -0
- data/lib/{plugin → plugins}/erb.rb +0 -0
- data/lib/{filter → plugins}/expand-tinyurl.rb +6 -6
- data/lib/plugins/favorite.rb +63 -0
- data/lib/plugins/fib.rb +28 -0
- data/lib/{filter/fib.rb → plugins/fib_filter.rb} +1 -2
- data/lib/{plugin → plugins}/filter.rb +0 -0
- data/lib/{plugin → plugins}/graduatter.rb +1 -2
- data/lib/{plugin → plugins}/grass.rb +2 -2
- data/lib/{plugin → plugins}/group.rb +9 -9
- data/lib/{plugin → plugins}/growl.rb +11 -12
- data/lib/{plugin → plugins}/hatebu.rb +5 -5
- data/lib/{plugin → plugins}/history.rb +13 -13
- data/lib/plugins/ignore.rb +19 -0
- data/lib/plugins/keyword.rb +18 -0
- data/lib/{plugin → plugins}/log.rb +18 -12
- data/lib/{plugin → plugins}/me.rb +1 -2
- data/lib/{plugin → plugins}/modify_arg_hook_sample.rb +0 -0
- data/lib/{plugin → plugins}/msagent.rb +1 -1
- data/lib/plugins/multi_reply.rb +27 -0
- data/lib/{plugin → plugins}/notify-send.rb +1 -1
- data/lib/{plugin → plugins}/otsune.rb +0 -0
- data/lib/plugins/outputz.rb +33 -0
- data/lib/{plugin → plugins}/pause.rb +0 -0
- data/lib/{plugin → plugins}/plugin.rb +0 -0
- data/lib/{plugin → plugins}/post_exec_hook_sample.rb +0 -0
- data/lib/{plugin → plugins}/pre_exec_hook_sample.rb +0 -0
- data/lib/{plugin → plugins}/primes.rb +9 -2
- data/lib/plugins/quicklook.rb +41 -0
- data/lib/{plugin → plugins}/random.rb +0 -0
- data/lib/{plugin → plugins}/reblog.rb +3 -3
- data/lib/{plugin → plugins}/reload.rb +0 -0
- data/lib/{filter → plugins}/reply.rb +0 -0
- data/lib/{filter → plugins}/reverse.rb +1 -1
- data/lib/{plugin → plugins}/say.rb +1 -1
- data/lib/{plugin → plugins}/scrape.rb +4 -4
- data/lib/plugins/screen-notify.rb +13 -0
- data/lib/plugins/screen.rb +24 -0
- data/lib/{plugin → plugins}/shell.rb +0 -0
- data/lib/{plugin → plugins}/sl.rb +4 -4
- data/lib/plugins/spam.rb +13 -0
- data/lib/{plugin → plugins}/standard_plugins.rb +72 -18
- data/lib/plugins/stdout.rb +80 -0
- data/lib/plugins/storage/DB.rb +37 -0
- data/lib/plugins/storage/status.rb +48 -0
- data/lib/plugins/storage/status_mook.rb +30 -0
- data/lib/plugins/storage.rb +47 -0
- data/lib/plugins/system_status.rb +33 -0
- data/lib/{plugin → plugins}/translation.rb +15 -5
- data/lib/{plugin → plugins}/update_editor.rb +6 -6
- data/lib/plugins/uri-open.rb +64 -0
- data/lib/{filter → plugins}/url_addspace.rb +0 -0
- data/lib/{plugin → plugins}/wassr_post.rb +1 -1
- data/lib/{plugin → plugins}/yhara.rb +1 -1
- data/lib/plugins/yhara_filter.rb +8 -0
- data/lib/plugins/yonda.rb +21 -0
- data/lib/termtter/api.rb +28 -2
- data/lib/termtter/client.rb +90 -102
- data/lib/termtter/command.rb +32 -31
- data/lib/termtter/config.rb +64 -0
- data/lib/termtter/connection.rb +9 -7
- data/lib/termtter/hook.rb +11 -2
- data/lib/termtter/optparse.rb +14 -0
- data/lib/termtter/version.rb +1 -1
- data/lib/termtter.rb +19 -22
- data/spec/plugin/english_spec.rb +19 -0
- data/spec/plugin/favorite_spec.rb +10 -0
- data/spec/plugin/fib_spec.rb +1 -2
- data/spec/plugin/pause_spec.rb +8 -0
- data/spec/plugin/plugin_spec.rb +1 -1
- data/spec/plugin/primes_spec.rb +15 -0
- data/spec/plugin/sl_spec.rb +8 -0
- data/spec/plugin/spam_spec.rb +0 -13
- data/spec/plugin/standard_plugins_spec.rb +0 -7
- data/spec/plugin/storage/DB_spec.rb +12 -0
- data/spec/plugin/storage/status_spec.rb +24 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/termtter/client_spec.rb +63 -1
- data/spec/termtter/command_spec.rb +6 -68
- data/spec/termtter/config_spec.rb +111 -0
- data/spec/termtter/hook_spec.rb +69 -0
- data/spec/termtter_spec.rb +22 -34
- metadata +81 -72
- data/lib/filter/english.rb +0 -8
- data/lib/filter/ignore.rb +0 -19
- data/lib/filter/yhara.rb +0 -20
- data/lib/plugin/bomb.rb +0 -29
- data/lib/plugin/english.rb +0 -59
- data/lib/plugin/favorite.rb +0 -75
- data/lib/plugin/fib.rb +0 -8
- data/lib/plugin/follow.rb +0 -60
- data/lib/plugin/keyword.rb +0 -18
- data/lib/plugin/multi_reply.rb +0 -36
- data/lib/plugin/outputz.rb +0 -35
- data/lib/plugin/quicklook.rb +0 -38
- data/lib/plugin/screen.rb +0 -24
- data/lib/plugin/spam.rb +0 -9
- data/lib/plugin/stdout.rb +0 -63
- data/lib/plugin/system_status.rb +0 -33
- data/lib/plugin/uri-open.rb +0 -69
- data/lib/plugin/yonda.rb +0 -20
- data/lib/termtter/status.rb +0 -26
- data/lib/termtter/twitter.rb +0 -188
- data/lib/termtter/user.rb +0 -13
- data/spec/termtter/user_spec.rb +0 -27
- data/test/test_termtter.rb +0 -86
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Termtter::Client
|
4
|
+
register_command(
|
5
|
+
:name => :multi_reply, :aliases => [:mr],
|
6
|
+
:exec_proc => lambda {|arg|
|
7
|
+
text = ERB.new(arg).result(binding).gsub(/\n/, ' ')
|
8
|
+
unless text.empty?
|
9
|
+
/(@(.+))*\s+(.+)/ =~ text
|
10
|
+
if $1
|
11
|
+
msg = $3
|
12
|
+
text = $1.split(/\s+/).map {|u| "#{u} #{msg}" }
|
13
|
+
end
|
14
|
+
Array(text).each do |post|
|
15
|
+
Termtter::API.twitter.update(post)
|
16
|
+
puts "=> #{post}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
},
|
20
|
+
:completion_proc => lambda {|cmd, args|
|
21
|
+
if /(.*)@([^\s]*)$/ =~ args
|
22
|
+
find_user_candidates $2, "#{cmd} #{$1}@%s"
|
23
|
+
end
|
24
|
+
},
|
25
|
+
:help => ["multi_reply,mp TEXT", "Reply to multi user"]
|
26
|
+
)
|
27
|
+
end
|
@@ -7,7 +7,7 @@ Termtter::Client.add_hook do |statuses, event|
|
|
7
7
|
text = statuses.take(max).map {|s|
|
8
8
|
status_text = CGI.escapeHTML(s.text)
|
9
9
|
status_text.gsub!(%r{https?://[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+},'<a href="\0">\0</a>')
|
10
|
-
"<b>#{s.
|
10
|
+
"<b>#{s.user.screen_name}:</b> <span font=\"9.0\">#{status_text}</span>"
|
11
11
|
}.join("\n")
|
12
12
|
|
13
13
|
text << %Q|\n<a href="http://twitter.com/">more...</a>| if statuses.size > max
|
File without changes
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Termtter::Client
|
4
|
+
config.plugins.outputz.set_default(:uri, 'termtter://twitter.com/status/update')
|
5
|
+
|
6
|
+
key = config.plugins.outputz.secret_key
|
7
|
+
if key.empty?
|
8
|
+
puts 'Need your secret key'
|
9
|
+
puts 'please set config.plugins.outputz.secret_key'
|
10
|
+
else
|
11
|
+
register_hook(
|
12
|
+
:name => :outputz,
|
13
|
+
:points => [:pre_exec_update],
|
14
|
+
:exec_proc => lambda {|cmd, arg|
|
15
|
+
Thead.new do
|
16
|
+
Termtter::API.connection.start('outputz.com', 80) do |http|
|
17
|
+
key = CGI.escape key
|
18
|
+
uri = CGI.escape config.plugins.outputz.uri
|
19
|
+
size = arg.split(//).size
|
20
|
+
http.post('/api/post', "key=#{key}&uri=#{uri}&size=#{size}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
}
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# outputz.rb
|
29
|
+
# a plugin that report to outputz your post
|
30
|
+
#
|
31
|
+
# settings (note: must this order)
|
32
|
+
# config.plugins.outputz.secret_key = 'your secret key'
|
33
|
+
# plugin 'outputz'
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
def primes(n)
|
4
|
+
return "" if n < 3
|
4
5
|
table = []
|
5
6
|
(2 .. n).each do |i|
|
6
7
|
table << i
|
@@ -18,6 +19,12 @@ def primes(n)
|
|
18
19
|
end
|
19
20
|
|
20
21
|
module Termtter::Client
|
21
|
-
|
22
|
-
|
22
|
+
register_command(
|
23
|
+
:name => :primes,
|
24
|
+
:exec_proc => lambda {|arg|
|
25
|
+
n = arg.to_i
|
26
|
+
text = "primes(#{n}) = {#{primes n}}}"
|
27
|
+
puts "=> " << text
|
28
|
+
}
|
29
|
+
)
|
23
30
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'uri'
|
4
|
+
require 'open-uri'
|
5
|
+
require 'pathname'
|
6
|
+
require 'tmpdir'
|
7
|
+
|
8
|
+
config.plugins.quicklook.set_default(:quicklook_tmpdir, "#{Dir.tmpdir}/termtter-quicklook-tmpdir")
|
9
|
+
tmpdir = Pathname.new(config.plugins.quicklook.quicklook_tmpdir)
|
10
|
+
tmpdir.mkdir unless tmpdir.exist?
|
11
|
+
|
12
|
+
def quicklook(url)
|
13
|
+
tmpdir = Pathname.new(config.plugins.quicklook.quicklook_tmpdir)
|
14
|
+
path = tmpdir + Pathname.new(url).basename
|
15
|
+
|
16
|
+
Thread.new do
|
17
|
+
open(path, 'w') do |f|
|
18
|
+
f.write(open(url).read)
|
19
|
+
end
|
20
|
+
system("qlmanage -p #{path} > /dev/null 2>&1")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module Termtter::Client
|
25
|
+
register_command(
|
26
|
+
:name => :quicklook, :aliases => [:ql],
|
27
|
+
:exec_proc => proc{|arg|
|
28
|
+
status = Termtter::API.twitter.show(arg)
|
29
|
+
if (status)
|
30
|
+
uris = URI.regexp.match(status.text).to_a
|
31
|
+
quicklook(uris.first) unless uris.empty?
|
32
|
+
end
|
33
|
+
}
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
# quicklook.rb
|
38
|
+
# REQUIREMENTS:
|
39
|
+
# plugin 'expand-tinyurl'
|
40
|
+
# TODO:
|
41
|
+
# Close quicklook window automatically.
|
File without changes
|
@@ -17,7 +17,7 @@ module Termtter::Client
|
|
17
17
|
status = t.show(id).first
|
18
18
|
end
|
19
19
|
|
20
|
-
Tumblr::API.write(
|
20
|
+
Tumblr::API.write(config.plugins.reblog.email, config.plugins.reblog.password) do
|
21
21
|
quote("#{status.text}", "<a href=\"http://twitter.com/#{status.user_screen_name}/status/#{status.id}\">Twitter / #{status.user_name}</a>")
|
22
22
|
end
|
23
23
|
end
|
@@ -34,7 +34,7 @@ end
|
|
34
34
|
# reblog.rb
|
35
35
|
# tumblr reblog it!
|
36
36
|
#
|
37
|
-
#
|
38
|
-
#
|
37
|
+
# config.plugins.reblog.email = 'your-email-on-tumblr'
|
38
|
+
# config.plugins.reblog.password = 'your-password-on-tumblr'
|
39
39
|
#
|
40
40
|
# reblog 1114860346
|
File without changes
|
File without changes
|
@@ -14,7 +14,7 @@ module Termtter::Client
|
|
14
14
|
if !statuses.empty? && event == :update_friends_timeline
|
15
15
|
statuses.reverse.each do |s|
|
16
16
|
text_without_uri = s.text.gsub(%r|https?://[^\s]+|, 'U.R.I.')
|
17
|
-
say s.
|
17
|
+
say s.user.screen_name, text_without_uri
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -6,13 +6,13 @@ module Termtter::Client
|
|
6
6
|
statuses = []
|
7
7
|
members.each_with_index do |member, index|
|
8
8
|
puts "member #{index+1}/#{members.size} #{member}"
|
9
|
-
statuses += Termtter::API.twitter.
|
9
|
+
statuses += Termtter::API.twitter.user_timeline(member)
|
10
10
|
end
|
11
11
|
statuses
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.scrape_group(group)
|
15
|
-
members =
|
15
|
+
members = config.plugins.group.groups[group] || []
|
16
16
|
scrape_members(members)
|
17
17
|
end
|
18
18
|
|
@@ -21,12 +21,12 @@ module Termtter::Client
|
|
21
21
|
:exec_proc => lambda{ |args|
|
22
22
|
groups = args.split(' ').map{|g| g.to_sym}
|
23
23
|
if groups.include? :all
|
24
|
-
groups =
|
24
|
+
groups = config.plugins.group.groups.keys
|
25
25
|
puts "get all groups..."
|
26
26
|
end
|
27
27
|
members = []
|
28
28
|
groups.each do |group|
|
29
|
-
members +=
|
29
|
+
members += config.plugins.group.groups[group]
|
30
30
|
end
|
31
31
|
statuses = scrape_members(members.uniq.compact.sort)
|
32
32
|
call_hooks(statuses, :pre_filter)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
if config.screen_notify.format.nil? or config.screen_notify.format.empty?
|
3
|
+
config.screen_notify.format = "[termtter] @%s"
|
4
|
+
end
|
5
|
+
|
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
|
13
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Termtter
|
4
|
+
module Plugin
|
5
|
+
module Screen
|
6
|
+
def self.set_title(title)
|
7
|
+
print "\033k#{title}\033\\\n"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Add below to your ~/.termtter
|
14
|
+
#
|
15
|
+
# require 'plugins/yonda'
|
16
|
+
# require 'plugins/screen'
|
17
|
+
# module Termtter::Client
|
18
|
+
# register_hook(:name => :screen,
|
19
|
+
# :points => [:post_exec__update_timeline, :plugin_yonda_yonda, :post_exec_yonda],
|
20
|
+
# :exec_proc => lambda { |cmd, arg, result|
|
21
|
+
# Termtter::Plugin::Screen::set_title("termtter(#{public_storage[:unread_count]})")
|
22
|
+
# }
|
23
|
+
# )
|
24
|
+
# end
|
File without changes
|
@@ -5,8 +5,8 @@ module Termtter
|
|
5
5
|
module Client
|
6
6
|
|
7
7
|
public_storage[:current] = ''
|
8
|
-
public_storage[:orig_prompt] =
|
9
|
-
|
8
|
+
public_storage[:orig_prompt] = config.prompt
|
9
|
+
config.prompt = "~/ #{public_storage[:orig_prompt]}"
|
10
10
|
|
11
11
|
register_command(
|
12
12
|
:name => :sl, :aliases => [],
|
@@ -23,7 +23,7 @@ module Termtter
|
|
23
23
|
register_command(
|
24
24
|
:name => :ls, :aliases => [],
|
25
25
|
:exec_proc => lambda {|arg|
|
26
|
-
call_commands("list #{arg.empty? ? public_storage[:current] : arg}"
|
26
|
+
call_commands("list #{arg.empty? ? public_storage[:current] : arg}")
|
27
27
|
},
|
28
28
|
:completion_proc => lambda {|cmd, args|
|
29
29
|
find_user_candidates args, "#{cmd} %s"
|
@@ -36,7 +36,7 @@ module Termtter
|
|
36
36
|
:exec_proc => lambda {|arg|
|
37
37
|
public_storage[:current] =
|
38
38
|
(arg.nil? || /\~/ =~ arg) ? '' : arg
|
39
|
-
|
39
|
+
config.prompt = "~/#{public_storage[:current]} #{public_storage[:orig_prompt]}"
|
40
40
|
},
|
41
41
|
:completion_proc => lambda {|cmd, args|
|
42
42
|
find_user_candidates args, "#{cmd} %s"
|
data/lib/plugins/spam.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
Termtter::API.twitter.update('*super spam time*')
|
4
|
+
Termtter::Client.register_hook(
|
5
|
+
:name => :span,
|
6
|
+
:points => [/^pre_exec/],
|
7
|
+
:exec_proc => lambda{|*arg|
|
8
|
+
text = arg.join(' ')
|
9
|
+
Termtter::API.twitter.update(text)
|
10
|
+
puts "=> #{text}"
|
11
|
+
false
|
12
|
+
}
|
13
|
+
)
|
@@ -9,9 +9,12 @@ module Termtter::Client
|
|
9
9
|
register_command(
|
10
10
|
:name => :update, :aliases => [:u],
|
11
11
|
:exec_proc => lambda {|arg|
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
unless arg =~ /^\s*$/
|
13
|
+
text = ERB.new(arg).result(binding).gsub(/\n/, ' ')
|
14
|
+
result = Termtter::API.twitter.update(text)
|
15
|
+
puts "=> #{text}"
|
16
|
+
result
|
17
|
+
end
|
15
18
|
},
|
16
19
|
:completion_proc => lambda {|cmd, args|
|
17
20
|
if /(.*)@([^\s]*)$/ =~ args
|
@@ -39,7 +42,7 @@ module Termtter::Client
|
|
39
42
|
register_command(
|
40
43
|
:name => :profile, :aliases => [:p],
|
41
44
|
:exec_proc => lambda {|arg|
|
42
|
-
user = Termtter::API.twitter.
|
45
|
+
user = Termtter::API.twitter.user(arg.strip)
|
43
46
|
attrs = %w[ name screen_name url description profile_image_url location protected following
|
44
47
|
friends_count followers_count statuses_count favourites_count
|
45
48
|
id time_zone created_at utc_offset notifications
|
@@ -58,19 +61,27 @@ module Termtter::Client
|
|
58
61
|
register_command(
|
59
62
|
:name => :followers,
|
60
63
|
:exec_proc => lambda {|arg|
|
61
|
-
|
64
|
+
user_name = arg.strip
|
65
|
+
user_name = config.user_name if user_name.empty?
|
66
|
+
|
67
|
+
followers = []
|
68
|
+
page = 0
|
69
|
+
begin
|
70
|
+
followers += tmp = Termtter::API.twitter.followers(user_name, :page => page+=1)
|
71
|
+
end until tmp.empty?
|
62
72
|
Termtter::Client.public_storage[:followers] = followers
|
63
73
|
puts followers.map{|f|f.screen_name}.join(' ')
|
64
74
|
}
|
75
|
+
# TODO :completion_proc
|
65
76
|
)
|
66
77
|
|
67
78
|
register_command(
|
68
79
|
:name => :list, :aliases => [:l],
|
69
80
|
:exec_proc => lambda {|arg|
|
70
81
|
unless arg.empty?
|
71
|
-
call_hooks(Termtter::API.twitter.
|
82
|
+
call_hooks(Termtter::API.twitter.user_timeline(arg), :list_user_timeline)
|
72
83
|
else
|
73
|
-
call_hooks(Termtter::API.twitter.
|
84
|
+
call_hooks(Termtter::API.twitter.friends_timeline(), :list_friends_timeline)
|
74
85
|
end
|
75
86
|
},
|
76
87
|
:completion_proc => lambda {|cmd, arg|
|
@@ -122,13 +133,43 @@ module Termtter::Client
|
|
122
133
|
:completion_proc => get_command(:show).completion_proc
|
123
134
|
)
|
124
135
|
|
136
|
+
register_command(
|
137
|
+
:name => :follow, :aliases => [],
|
138
|
+
:exec_proc => lambda {|args|
|
139
|
+
args.split(' ').each do |arg|
|
140
|
+
if arg =~ /^(\w+)/
|
141
|
+
res = Termtter::API::twitter.follow($1.strip)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
},
|
145
|
+
:completion_proc => lambda {|cmd, args|
|
146
|
+
find_user_candidates args, "#{cmd} %s"
|
147
|
+
},
|
148
|
+
:help => ['follow USER', 'Follow user']
|
149
|
+
)
|
150
|
+
|
151
|
+
register_command(
|
152
|
+
:name => :leave, :aliases => [],
|
153
|
+
:exec_proc => lambda {|args|
|
154
|
+
args.split(' ').each do |arg|
|
155
|
+
if arg =~ /^(\w+)/
|
156
|
+
res = Termtter::API::twitter.leave($1.strip)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
},
|
160
|
+
:completion_proc => lambda {|cmd, args|
|
161
|
+
find_user_candidates args, "#{cmd} %s"
|
162
|
+
},
|
163
|
+
:help => ['leave USER', 'Leave user']
|
164
|
+
)
|
165
|
+
|
125
166
|
# TODO: Change colors when remaining_hits is low.
|
126
167
|
# TODO: Simmulate remaining_hits.
|
127
168
|
register_command(
|
128
169
|
:name => :limit, :aliases => [:lm],
|
129
170
|
:exec_proc => lambda {|arg|
|
130
|
-
limit = Termtter::API.twitter.
|
131
|
-
remaining_time = "%dmin %dsec" % (limit.reset_time - Time.now).divmod(60)
|
171
|
+
limit = Termtter::API.twitter.limit_status
|
172
|
+
remaining_time = "%dmin %dsec" % (Time.parse(limit.reset_time) - Time.now).divmod(60)
|
132
173
|
remaining_color =
|
133
174
|
case limit.remaining_hits / limit.hourly_limit.to_f
|
134
175
|
when 0.2..0.4 then :yellow
|
@@ -162,10 +203,20 @@ module Termtter::Client
|
|
162
203
|
:name => :default_error_handler,
|
163
204
|
:points => [:on_error],
|
164
205
|
:exec_proc => lambda {|e|
|
165
|
-
|
166
|
-
|
167
|
-
|
206
|
+
case e
|
207
|
+
when Rubytter::APIError
|
208
|
+
case e.response.code
|
209
|
+
when /401/
|
210
|
+
warn '[ERROR] Unauthorized: maybe you tried to show protected user status'
|
211
|
+
when /403/
|
212
|
+
warn '[ERROR] Access denied: maybe that user is protected'
|
213
|
+
when /404/
|
214
|
+
warn '[ERROR] Not found: maybe there is no such user'
|
215
|
+
end
|
216
|
+
else
|
217
|
+
warn "[ERROR] Something wrong: #{e.message}"
|
168
218
|
end
|
219
|
+
raise e if config.system.devel == true
|
169
220
|
}
|
170
221
|
)
|
171
222
|
|
@@ -197,7 +248,7 @@ module Termtter::Client
|
|
197
248
|
if arg
|
198
249
|
`#{arg}`.each_line do |line|
|
199
250
|
unless line.strip.empty?
|
200
|
-
Termtter::API.twitter.
|
251
|
+
Termtter::API.twitter.update(line)
|
201
252
|
puts "=> #{line}"
|
202
253
|
end
|
203
254
|
end
|
@@ -222,11 +273,14 @@ module Termtter::Client
|
|
222
273
|
public_storage[:status_ids] ||= Set.new
|
223
274
|
|
224
275
|
add_hook do |statuses, event, t|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
276
|
+
case event
|
277
|
+
when :update_friends_timeline, :list_friends_timeline, :list_user_timeline, :replies
|
278
|
+
statuses.each do |s|
|
279
|
+
public_storage[:users].add(s.user.screen_name)
|
280
|
+
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
|
283
|
+
end
|
230
284
|
end
|
231
285
|
end
|
232
286
|
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'termcolor'
|
4
|
+
require 'erb'
|
5
|
+
|
6
|
+
config.plugins.stdout.set_default(
|
7
|
+
:colors,
|
8
|
+
[:none, :red, :green, :yellow, :blue, :magenta, :cyan])
|
9
|
+
config.plugins.stdout.set_default(
|
10
|
+
:timeline_format,
|
11
|
+
'<90><%=time%></90> <<%=status_color%>><%=status%></<%=status_color%>> <90><%=id%></90>')
|
12
|
+
config.plugins.stdout.set_default(:search_highlihgt_format, '<on_magenta><white>\1</white></on_magenta>')
|
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)
|
41
|
+
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
|
+
|
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)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
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)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
# stdout.rb
|
77
|
+
# output statuses to stdout
|
78
|
+
# example config
|
79
|
+
# config.plugins.stdout.colors = [:none, :red, :green, :yellow, :blue, :magenta, :cyan]
|
80
|
+
# config.plugins.stdout.timeline_format = '<90><%=time%></90> <<%=status_color%>><%=status%></<%=status_color%>> <90><%=id%></90>'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'sqlite3'
|
4
|
+
require 'singleton'
|
5
|
+
|
6
|
+
module Termtter::Storage
|
7
|
+
class DB
|
8
|
+
include Singleton
|
9
|
+
attr_reader :db
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@db = SQLite3::Database.new(Termtter::CONF_DIR + '/storage.db')
|
13
|
+
@db.type_translation = true
|
14
|
+
create_table
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_table
|
18
|
+
sql =<<-SQL
|
19
|
+
CREATE TABLE IF NOT EXISTS user (
|
20
|
+
id int NOT NULL,
|
21
|
+
screen_name text,
|
22
|
+
PRIMARY KEY (id)
|
23
|
+
);
|
24
|
+
CREATE TABLE IF NOT EXISTS post (
|
25
|
+
post_id int NOT NULL, -- twitter側のpostのid
|
26
|
+
created_at int, -- 日付(RubyでUNIX時間に変換)
|
27
|
+
in_reply_to_status_id int, -- あったほうがよいらしい
|
28
|
+
in_reply_to_user_id int, -- あったほうがよいらしい
|
29
|
+
post_text text,
|
30
|
+
user_id int NOT NULL,
|
31
|
+
PRIMARY KEY (post_id)
|
32
|
+
);
|
33
|
+
SQL
|
34
|
+
@db.execute_batch(sql)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/DB'
|
4
|
+
require 'sqlite3'
|
5
|
+
|
6
|
+
module Termtter::Storage
|
7
|
+
class Status
|
8
|
+
KEYS = %w[post_id created_at in_reply_to_status_id in_reply_to_user_id post_text user_id screen_name]
|
9
|
+
|
10
|
+
def size
|
11
|
+
DB.instance.db.get_first_value("select count(*) from post").to_i
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.search(query)
|
15
|
+
raise "query must be Hash(#{query}, #{query.class})" unless query.kind_of? Hash
|
16
|
+
|
17
|
+
DB.instance.db.execute("select created_at, screen_name, post_text, in_reply_to_status_id, post_id from post inner join user on post.user_id = user.id where post_text like '%' || ? || '%' ", query[:post_text]) do |created_at, screen_name, post_text, in_reply_to_status_id, post_id|
|
18
|
+
|
19
|
+
# DB.instance.db.execute("select created_at, screen_name, post_text, in_reply_to_status_id, post_id from post inner join user on post.user_id = user.id where post_text like '%of%' ", query[:post_text]) do |created_at, screen_name, post_text, in_reply_to_status_id, post_id|
|
20
|
+
p [created_at, screen_name, post_text, in_reply_to_status_id, post_id]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.insert(data)
|
25
|
+
raise "data must be Hash(#{data}, #{data.class})" unless data.kind_of? Hash
|
26
|
+
# 条件しぼりたいけどやりかたがうまくわからない
|
27
|
+
# raise "unko" unless data.keys.all?{|c| KEYS.include? c}
|
28
|
+
begin
|
29
|
+
DB.instance.db.execute(
|
30
|
+
"insert into post values(?,?,?,?,?,?)",
|
31
|
+
data[:post_id],
|
32
|
+
data[:created_at],
|
33
|
+
data[:in_reply_to_status_id],
|
34
|
+
data[:in_reply_to_user_id],
|
35
|
+
data[:post_text],
|
36
|
+
data[:user_id])
|
37
|
+
begin
|
38
|
+
DB.instance.db.execute(
|
39
|
+
"insert into user values(?,?)",
|
40
|
+
data[:user_id],
|
41
|
+
data[:screen_name])
|
42
|
+
rescue # FIXME: specify exceptions here
|
43
|
+
end
|
44
|
+
rescue # FIXME: specify exceptions here
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'sqlite3'
|
4
|
+
|
5
|
+
module Termtter::Storage
|
6
|
+
class Status
|
7
|
+
def initialize
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.create
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.all
|
14
|
+
[]
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.search
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
def db
|
22
|
+
@db ||= connect
|
23
|
+
end
|
24
|
+
|
25
|
+
def connect
|
26
|
+
@db = SQLite3::Database.new(File.expand_path('~/test.db'))
|
27
|
+
@db.type_translation = true
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|