jugyo-termtter 0.8.14 → 1.0.0
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/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
data/README.rdoc
CHANGED
@@ -17,7 +17,8 @@ Run:
|
|
17
17
|
== REQUIREMENTS:
|
18
18
|
|
19
19
|
* json_pure
|
20
|
-
*
|
20
|
+
* termcolor
|
21
|
+
* rubytter
|
21
22
|
|
22
23
|
== INSTALL:
|
23
24
|
|
@@ -40,15 +41,15 @@ You can edit the file anytime.
|
|
40
41
|
|
41
42
|
vim ~/.termtter
|
42
43
|
|
43
|
-
|
44
|
-
|
44
|
+
config.user_name = 'USERNAME'
|
45
|
+
config.password = 'PASSWORD'
|
45
46
|
|
46
47
|
If you would like to use proxy server, add configurations like this:
|
47
48
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
config.proxy.host = 'PROXYHOST'
|
50
|
+
config.proxy.port = 'PROXYPORT'
|
51
|
+
config.proxy.user_name = 'USERNAME'
|
52
|
+
config.proxy.password = 'PASSWORD'
|
52
53
|
|
53
54
|
To update the config, just restart your termtter proccess.
|
54
55
|
|
@@ -62,7 +63,6 @@ http://wiki.github.com/jugyo/termtter/home (in Japanese)
|
|
62
63
|
|
63
64
|
== TODO:
|
64
65
|
|
65
|
-
- rubytter を使うようにする
|
66
66
|
- filter と plugin を統一する
|
67
67
|
- plugin => plugins (ディレクトリ名変更)
|
68
68
|
- $HOME 以下に plugin 用のディレクトリを置けるようにする
|
data/Rakefile
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
$:.unshift File.dirname(__FILE__) + '/lib'
|
2
|
-
require 'termtter'
|
3
|
-
|
4
2
|
require 'spec/rake/spectask'
|
5
3
|
desc 'run all specs'
|
6
4
|
Spec::Rake::SpecTask.new do |t|
|
@@ -10,6 +8,7 @@ end
|
|
10
8
|
|
11
9
|
desc 'Generate gemspec'
|
12
10
|
task :gemspec do |t|
|
11
|
+
require 'termtter'
|
13
12
|
open('termtter.gemspec', "wb" ) do |file|
|
14
13
|
file << <<-EOS
|
15
14
|
Gem::Specification.new do |s|
|
@@ -25,9 +24,9 @@ Gem::Specification.new do |s|
|
|
25
24
|
Rakefile )
|
26
25
|
s.executables = ["kill_termtter", "termtter"]
|
27
26
|
s.add_dependency("json_pure", ">= 1.1.3")
|
28
|
-
s.add_dependency("configatron", ">= 2.2.2")
|
29
27
|
s.add_dependency("highline", ">= 1.5.0")
|
30
28
|
s.add_dependency("termcolor", ">= 0.3.1")
|
29
|
+
s.add_dependency("rubytter", ">= 0.4.8")
|
31
30
|
s.authors = %w(jugyo ujihisa)
|
32
31
|
s.email = 'jugyo.org@gmail.com'
|
33
32
|
s.homepage = 'http://wiki.github.com/jugyo/termtter'
|
@@ -49,9 +48,8 @@ end
|
|
49
48
|
namespace :gem do
|
50
49
|
desc 'Install needed gems'
|
51
50
|
task :install do
|
52
|
-
%w[ json_pure
|
51
|
+
%w[ json_pure highline termcolor ].each do |gem|
|
53
52
|
sh "sudo gem install #{gem} -r"
|
54
53
|
end
|
55
54
|
end
|
56
55
|
end
|
57
|
-
|
File without changes
|
data/lib/plugins/bomb.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Termtter
|
4
|
+
|
5
|
+
module Client
|
6
|
+
config.plugins.bomb.color.set_default :foreground, 'white'
|
7
|
+
config.plugins.bomb.color.set_default :background, 'red'
|
8
|
+
|
9
|
+
add_hook do |statuses, event|
|
10
|
+
case event
|
11
|
+
when :post_filter
|
12
|
+
fg = config.plugins.bomb.color.foreground
|
13
|
+
bg = config.plugins.bomb.color.background
|
14
|
+
statuses = [statuses] unless statuses.instance_of? Array
|
15
|
+
statuses.each do |status|
|
16
|
+
if /爆発|bomb/ =~ status.text
|
17
|
+
status.text = "<on_#{bg}><#{fg}>#{status.text}</#{fg}></on_#{bg}>"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
register_command(
|
24
|
+
:name => :bomb, :aliases => [],
|
25
|
+
:exec_proc => lambda {|arg|
|
26
|
+
text = "#{arg.strip} 爆発しろ!"
|
27
|
+
Termtter::API::twitter.update(text)
|
28
|
+
puts "=> #{text}"
|
29
|
+
},
|
30
|
+
:help => ['bomb WORD', 'Bomb it']
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# bomb.rb
|
36
|
+
# Bomb it!
|
37
|
+
#
|
38
|
+
# See http://gyazo.com/4b33517380673d92f51a52e675ecdb02.png .
|
39
|
+
# config.plugins.bomb.color.foreground = 'white'
|
40
|
+
# config.plugins.bomb.color.background = 'red'
|
41
|
+
#
|
42
|
+
# vim: fenc=utf8
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# vim: set fenc=utf-8
|
3
|
+
|
4
|
+
module Termtter::English
|
5
|
+
# english? :: String -> Boolean
|
6
|
+
def self.english?(message)
|
7
|
+
/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+/ !~ message
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
Termtter::Client.add_filter do |statuses, event|
|
12
|
+
config.plugins.english.set_default(:only, [])
|
13
|
+
statuses.select {|i|
|
14
|
+
!config.plugins.english.only.include?(event) ||
|
15
|
+
Termtter::English.english?(i.text)
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
# english_filter.rb
|
20
|
+
# select English posts only
|
21
|
+
#
|
22
|
+
# config sample:
|
23
|
+
# plugin 'english'
|
24
|
+
# or,
|
25
|
+
# plugin 'english', :only => [:list_friends_timeline, :update_friends_timeline]
|
File without changes
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
module Termtter::Client
|
4
|
-
add_filter do |statuses|
|
4
|
+
add_filter do |statuses, event|
|
5
5
|
statuses.each do |s|
|
6
6
|
s.text.gsub!(%r'(http://tinyurl\.com(/[\w/]+))') do |m|
|
7
7
|
expand_tinyurl($2) || $1
|
@@ -13,11 +13,11 @@ end
|
|
13
13
|
|
14
14
|
def expand_tinyurl(path)
|
15
15
|
http_class = Net::HTTP
|
16
|
-
unless
|
17
|
-
http_class = Net::HTTP::Proxy(
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
unless config.proxy.host.nil? or config.proxy.host.empty?
|
17
|
+
http_class = Net::HTTP::Proxy(config.proxy.host,
|
18
|
+
config.proxy.port,
|
19
|
+
config.proxy.user_name,
|
20
|
+
config.proxy.password)
|
21
21
|
end
|
22
22
|
res = http_class.new('tinyurl.com').head(path)
|
23
23
|
res['Location']
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
def create_favorite(id)
|
4
|
+
r = Termtter::API.twitter.favorite id
|
5
|
+
puts "Favorited status ##{r.id} on user @#{r.user.screen_name} #{r.text}"
|
6
|
+
end
|
7
|
+
|
8
|
+
module Termtter::Client
|
9
|
+
register_command(
|
10
|
+
:name => :favorite, :aliases => [:fav],
|
11
|
+
:exec_proc => lambda {|arg|
|
12
|
+
id = 0
|
13
|
+
case arg
|
14
|
+
when /^\d+/
|
15
|
+
id = arg.to_i
|
16
|
+
when /^@([A-Za-z0-9_]+)/
|
17
|
+
user = $1
|
18
|
+
statuses = Termtter::API.twitter.user_timeline(user)
|
19
|
+
return if statuses.empty?
|
20
|
+
id = statuses[0].id
|
21
|
+
when /^\/(.*)$/
|
22
|
+
word = $1
|
23
|
+
raise "Not implemented yet."
|
24
|
+
else
|
25
|
+
return
|
26
|
+
end
|
27
|
+
|
28
|
+
create_favorite id
|
29
|
+
},
|
30
|
+
:completion_proc => lambda {|cmd, arg|
|
31
|
+
case arg
|
32
|
+
when /@(.*)/
|
33
|
+
find_user_candidates $1, "#{cmd} @%s"
|
34
|
+
when /(\d+)/
|
35
|
+
find_status_ids(arg).map{|id| "#{cmd} #{$1}"}
|
36
|
+
else
|
37
|
+
%w(favorite).grep(/^#{Regexp.quote arg}/)
|
38
|
+
end
|
39
|
+
},
|
40
|
+
:help => ['favorite,fav (ID|@USER|/WORD)', 'Favorite a status']
|
41
|
+
)
|
42
|
+
|
43
|
+
# TBD: Implement this when database support comes.
|
44
|
+
#
|
45
|
+
# if public_storage[:log]
|
46
|
+
# add_help 'favorite,fav /WORD', 'Favorite a status by searching'
|
47
|
+
#
|
48
|
+
# add_command %r'^(?:favorite|fav)\s+/(.+)$' do |m, t|
|
49
|
+
# pat = Regexp.new(m[1])
|
50
|
+
# statuses = public_storage[:log].select {|s| pat =~ s.text }
|
51
|
+
# if statuses.size == 1
|
52
|
+
# status = statuses.first
|
53
|
+
# res = t.favorite(status.id)
|
54
|
+
# if res.code == '200'
|
55
|
+
# puts %Q(Favorited "#{status.user.screen_name}: #{status.text}")
|
56
|
+
# else
|
57
|
+
# puts "Failed: #{res}"
|
58
|
+
# end
|
59
|
+
# else
|
60
|
+
# puts "#{pat} does not match single status"
|
61
|
+
# end
|
62
|
+
# end
|
63
|
+
end
|
data/lib/plugins/fib.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
def fib(n)i=0;j=1;n.times{j=i+i=j};i end
|
4
|
+
module Termtter::Client
|
5
|
+
register_command(
|
6
|
+
:name => :fib,
|
7
|
+
:exec_proc => lambda {|arg|
|
8
|
+
n = arg.to_i
|
9
|
+
text = "fib(#{n}) = #{fib n}"
|
10
|
+
Termtter::API.twitter.update(text)
|
11
|
+
puts "=> " << text
|
12
|
+
}
|
13
|
+
)
|
14
|
+
register_command(
|
15
|
+
:name => :fibyou,
|
16
|
+
:exec_proc => lambda {|arg|
|
17
|
+
/(\w+)\s(\d+)/ =~ arg
|
18
|
+
name = $1
|
19
|
+
n = $2.to_i
|
20
|
+
text = "@#{name} fib(#{n}) = #{fib n}"
|
21
|
+
Termtter::API.twitter.update(text)
|
22
|
+
puts "=> " << text
|
23
|
+
},
|
24
|
+
:completion_proc => lambda {|cmd, arg|
|
25
|
+
find_user_candidates arg, "#{cmd} %s"
|
26
|
+
}
|
27
|
+
)
|
28
|
+
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
def fib(n)i=0;j=1;n.times{j=i+i=j};i end
|
4
4
|
module Termtter::Client
|
5
|
-
add_filter do |statuses|
|
5
|
+
add_filter do |statuses, _|
|
6
6
|
statuses.each do |s|
|
7
7
|
s.text.gsub!(/(\d+)/) do |m|
|
8
8
|
n = $1.to_i
|
@@ -12,4 +12,3 @@ module Termtter::Client
|
|
12
12
|
statuses
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
File without changes
|
@@ -1,9 +1,8 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
twitter = Termtter::Twitter.new(configatron.user_name, configatron.password)
|
4
3
|
Thread.start do
|
5
4
|
100.times do |i|
|
6
|
-
twitter.
|
5
|
+
Twitter::API.twitter.update(
|
7
6
|
"I decided not to use twitter so as not to leave university before I complete the dissertation#{i.odd? ? '!' : '.'}")
|
8
7
|
end
|
9
8
|
end
|
@@ -2,14 +2,14 @@
|
|
2
2
|
module Termtter
|
3
3
|
module Client
|
4
4
|
|
5
|
-
|
5
|
+
config.plugins.grass.set_default(:rate, 0)
|
6
6
|
|
7
7
|
register_command(
|
8
8
|
:name => :w, :aliases => [:grass],
|
9
9
|
:exec_proc => lambda {|arg|
|
10
10
|
arg, rate = arg.split(/ /)
|
11
11
|
count = arg =~ /^[0-9]+$/ ? arg.to_i : 3
|
12
|
-
rate ||=
|
12
|
+
rate ||= config.plugins.grass.rate
|
13
13
|
grow = (count * rate.to_i).quo(100).round
|
14
14
|
grasses = ('w' * (count-grow) + 'W' * grow).split(//).shuffle.join
|
15
15
|
call_commands("update #{grasses}")
|
@@ -4,20 +4,20 @@ module Termtter
|
|
4
4
|
class Status
|
5
5
|
def is_member?(group = nil)
|
6
6
|
if group
|
7
|
-
|
7
|
+
config.plugins.group.groups[group].include? self.user_screen_name
|
8
8
|
else
|
9
|
-
|
9
|
+
config.plugins.group.groups.values.flatten.include? self.user_screen_name
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
module Termtter::Client
|
16
|
-
|
16
|
+
config.plugins.group.
|
17
17
|
set_default(:groups, {})
|
18
18
|
|
19
19
|
def self.find_group_candidates(a, b)
|
20
|
-
|
20
|
+
config.plugins.group.groups.keys.map {|k| k.to_s}.
|
21
21
|
grep(/^#{Regexp.quote a}/).
|
22
22
|
map {|u| b % u }
|
23
23
|
end
|
@@ -29,16 +29,16 @@ module Termtter::Client
|
|
29
29
|
unless arg.empty?
|
30
30
|
group_name = arg.to_sym
|
31
31
|
if group_name == :all
|
32
|
-
group =
|
32
|
+
group = config.plugins.group.groups.values.flatten.uniq
|
33
33
|
else
|
34
|
-
group =
|
34
|
+
group = config.plugins.group.groups[group_name]
|
35
35
|
end
|
36
36
|
statuses = group ? public_storage[:log].select { |s|
|
37
|
-
group.include?(s.
|
37
|
+
group.include?(s.user.screen_name)
|
38
38
|
} : []
|
39
39
|
call_hooks(statuses, :search)
|
40
40
|
else
|
41
|
-
|
41
|
+
config.plugins.group.groups.each_pair do |key, value|
|
42
42
|
puts "#{key}: #{value.join(',')}"
|
43
43
|
end
|
44
44
|
end
|
@@ -53,7 +53,7 @@ end
|
|
53
53
|
|
54
54
|
# group.rb
|
55
55
|
# plugin 'group'
|
56
|
-
#
|
56
|
+
# config.plugins.group.groups = {
|
57
57
|
# :rits => %w(hakobe isano hitode909)
|
58
58
|
# }
|
59
59
|
# NOTE: group.rb needs plugin/log
|
@@ -12,11 +12,11 @@ rescue LoadError
|
|
12
12
|
growl = nil
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
FileUtils.mkdir_p(
|
15
|
+
config.plugins.growl.set_default(:icon_cache_dir, "#{Dir.tmpdir}/termtter-icon-cache-dir")
|
16
|
+
FileUtils.mkdir_p(config.plugins.growl.icon_cache_dir) unless File.exist?(config.plugins.growl.icon_cache_dir)
|
17
17
|
|
18
18
|
def get_icon_path(s)
|
19
|
-
cache_file = "%s/%s%s" % [
|
19
|
+
cache_file = "%s/%s%s" % [ config.plugins.growl.icon_cache_dir,
|
20
20
|
s.user_screen_name,
|
21
21
|
File.extname(s.user_profile_image_url) ]
|
22
22
|
if File.exist?(cache_file) && (File.atime(cache_file) + 24*60*60) > Time.now
|
@@ -37,12 +37,12 @@ Thread.new do
|
|
37
37
|
begin
|
38
38
|
if s = queue.pop
|
39
39
|
unless growl
|
40
|
-
arg = ['growlnotify', s.
|
40
|
+
arg = ['growlnotify', s.user.screen_name, '-m', s.text.gsub("\n",''), '-n', 'termtter']
|
41
41
|
#icon_path = get_icon_path(s)
|
42
42
|
#arg += ['--image', icon_path] if icon_path
|
43
43
|
system *arg
|
44
44
|
else
|
45
|
-
growl.notify "termtter status notification", s.text, s.
|
45
|
+
growl.notify "termtter status notification", s.text, s.user.screen_name
|
46
46
|
end
|
47
47
|
end
|
48
48
|
rescue => e
|
@@ -53,10 +53,9 @@ Thread.new do
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
Termtter::Client.
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
56
|
+
Termtter::Client.register_hook(:name => :growl,
|
57
|
+
:points => [:post_exec__update_timeline],
|
58
|
+
:exec_proc => lambda { |cmd, arg, result|
|
59
|
+
result.reverse.each { |s| queue << s }
|
60
|
+
}
|
61
|
+
)
|
@@ -17,11 +17,11 @@ module Termtter::Client
|
|
17
17
|
status = t.show(id).first
|
18
18
|
end
|
19
19
|
auth = auth = Atompub::Auth::Wsse.new({
|
20
|
-
:username =>
|
21
|
-
:password =>
|
20
|
+
:username => config.plugins.hatebu.username,
|
21
|
+
:password => config.plugins.hatebu.password,
|
22
22
|
})
|
23
23
|
link = Atom::Link.new({
|
24
|
-
:href => "http://twitter.com/#{status.
|
24
|
+
:href => "http://twitter.com/#{status.user.screen_name}/status/#{status.id}",
|
25
25
|
:rel => 'related',
|
26
26
|
:type => 'text/html',
|
27
27
|
})
|
@@ -53,7 +53,7 @@ end
|
|
53
53
|
# hatebu.rb
|
54
54
|
# hatena bookmark it!
|
55
55
|
#
|
56
|
-
#
|
57
|
-
#
|
56
|
+
# config.plugins.hatebu.username = 'your-username-on-hatena'
|
57
|
+
# config.plugins.hatebu.password = 'your-password-on-hatena'
|
58
58
|
#
|
59
59
|
# hatebu 1114860346 [termtter][<82>±<82>ê<82>Í<82>·<82>²<82>¢]mattn++
|
@@ -2,21 +2,21 @@
|
|
2
2
|
|
3
3
|
require 'zlib'
|
4
4
|
|
5
|
-
|
5
|
+
config.plugins.history.
|
6
6
|
set_default(:filename, '~/.termtter_history')
|
7
|
-
|
7
|
+
config.plugins.history.
|
8
8
|
set_default(:keys, [:log, :users, :status_ids])
|
9
|
-
|
9
|
+
config.plugins.history.
|
10
10
|
set_default(:max_of_history, 100)
|
11
|
-
|
11
|
+
config.plugins.history.
|
12
12
|
set_default(:enable_autosave, true)
|
13
|
-
|
13
|
+
config.plugins.history.
|
14
14
|
set_default(:autosave_interval, 3600)
|
15
15
|
|
16
16
|
module Termtter::Client
|
17
17
|
def self.load_history
|
18
|
-
filename = File.expand_path(
|
19
|
-
keys =
|
18
|
+
filename = File.expand_path(config.plugins.history.filename)
|
19
|
+
keys = config.plugins.history.keys
|
20
20
|
|
21
21
|
if File.exist?(filename)
|
22
22
|
begin
|
@@ -33,13 +33,13 @@ module Termtter::Client
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def self.save_history
|
36
|
-
filename = File.expand_path(
|
37
|
-
keys =
|
36
|
+
filename = File.expand_path(config.plugins.history.filename)
|
37
|
+
keys = config.plugins.history.keys
|
38
38
|
history = { }
|
39
39
|
keys.each do |key|
|
40
40
|
history[key] = public_storage[key]
|
41
41
|
end
|
42
|
-
max_of_history =
|
42
|
+
max_of_history = config.plugins.history.max_of_history
|
43
43
|
history[:history] = Readline::HISTORY.to_a.reverse.uniq.reverse
|
44
44
|
if history[:history].size > max_of_history
|
45
45
|
history[:history] = history[:history][-max_of_history..-1]
|
@@ -60,9 +60,9 @@ module Termtter::Client
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
if
|
64
|
-
Termtter::Client.add_task(:interval =>
|
65
|
-
:after =>
|
63
|
+
if config.plugins.history.enable_autosave
|
64
|
+
Termtter::Client.add_task(:interval => config.plugins.history.autosave_interval,
|
65
|
+
:after => config.plugins.history.autosave_interval) do
|
66
66
|
save_history
|
67
67
|
end
|
68
68
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
config.filters.ignore.set_default(:words, [])
|
5
|
+
|
6
|
+
module Termtter::Client
|
7
|
+
add_filter do |statuses, _|
|
8
|
+
ignore_words = config.filters.ignore.words
|
9
|
+
statuses.delete_if do |s|
|
10
|
+
ignore_words.any? {|i| i =~ s.text }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# filter/ignore.rb
|
16
|
+
# ignore words
|
17
|
+
# setting
|
18
|
+
# config.filters.ignore.words = [ /ignore/, /words/ ]
|
19
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
config.set_default('plugins.keyword.keywords', [])
|
4
|
+
|
5
|
+
module Termtter
|
6
|
+
class Status
|
7
|
+
def has_keyword?
|
8
|
+
config.plugins.keyword.keywords.find { |k| k === self.text }
|
9
|
+
end
|
10
|
+
alias :has_keyword :has_keyword?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# keyword.rb
|
15
|
+
# provides a keyword watching method
|
16
|
+
# example config
|
17
|
+
# config.plugins.stdout.timeline_format = '<%= color(time, 90) %> <%= color(status, s.has_keyword ? 4 : status_color) %> <%= color(id, 90) %>'
|
18
|
+
# config.plugins.keyword.keywords = [ /motemen/ ]
|
@@ -2,18 +2,30 @@
|
|
2
2
|
|
3
3
|
module Termtter::Client
|
4
4
|
public_storage[:log] = []
|
5
|
-
|
6
|
-
|
5
|
+
public_storage[:tweet] = { }
|
6
|
+
config.plugins.log.set_default('max_size', 1/0.0)
|
7
|
+
config.plugins.log.set_default('print_max_size', 30)
|
7
8
|
|
8
9
|
add_hook do |statuses, event|
|
9
10
|
case event
|
10
11
|
when :pre_filter
|
12
|
+
# log(sequential storage)
|
11
13
|
public_storage[:log] += statuses
|
12
|
-
max_size =
|
14
|
+
max_size = config.plugins.log.max_size
|
13
15
|
if public_storage[:log].size > max_size
|
14
16
|
public_storage[:log] = public_storage[:log][-max_size..-1]
|
15
17
|
end
|
16
18
|
public_storage[:log] = public_storage[:log].uniq.sort_by{|a| a.created_at} if statuses.first
|
19
|
+
|
20
|
+
# tweet(storage for each user)
|
21
|
+
|
22
|
+
statuses.each do |s|
|
23
|
+
public_storage[:tweet][s.user.screen_name] = [] unless public_storage[:tweet][s.user.screen_name]
|
24
|
+
public_storage[:tweet][s.user.screen_name] << s
|
25
|
+
if public_storage[:tweet].size > max_size
|
26
|
+
public_storage[:tweet] = public_storage[:tweet][-max_size..-1]
|
27
|
+
end
|
28
|
+
end
|
17
29
|
end
|
18
30
|
end
|
19
31
|
|
@@ -23,15 +35,15 @@ module Termtter::Client
|
|
23
35
|
if arg.empty?
|
24
36
|
# log
|
25
37
|
statuses = public_storage[:log]
|
26
|
-
print_max =
|
38
|
+
print_max = config.plugins.log.print_max_size
|
27
39
|
print_max = 0 if statuses.size < print_max
|
28
40
|
call_hooks(statuses[-print_max..-1], :search)
|
29
41
|
else
|
30
42
|
# log (user) (max)
|
31
43
|
vars = arg.split(' ')
|
32
|
-
print_max = vars.last =~ /^\d+$/ ? vars.pop.to_i :
|
44
|
+
print_max = vars.last =~ /^\d+$/ ? vars.pop.to_i : config.plugins.log.print_max_size
|
33
45
|
id = vars
|
34
|
-
statuses = id.first ? public_storage[:log].select{ |s| id.include? s.
|
46
|
+
statuses = id.first ? public_storage[:log].select{ |s| id.include? s.user.screen_name} : public_storage[:log]
|
35
47
|
print_max = 0 if statuses.size < print_max
|
36
48
|
call_hooks(statuses[-print_max..-1], :search)
|
37
49
|
end
|
@@ -54,10 +66,4 @@ module Termtter::Client
|
|
54
66
|
:help => [ 'search_log WORD', 'Search log for WORD' ]
|
55
67
|
)
|
56
68
|
|
57
|
-
add_command %r'^/(.+)' do |m, t|
|
58
|
-
warn '/WORD command will be removed. Use search_log command instead.'
|
59
|
-
pat = Regexp.new(m[1])
|
60
|
-
statuses = public_storage[:log].select { |s| s.text =~ pat }
|
61
|
-
call_hooks(statuses, :search, t)
|
62
|
-
end
|
63
69
|
end
|
@@ -3,8 +3,7 @@ module Termtter::Client
|
|
3
3
|
register_command(
|
4
4
|
:name => :me, :aliases => [],
|
5
5
|
:exec_proc => lambda {|arg|
|
6
|
-
|
7
|
-
call_hooks(Termtter::API.twitter.get_user_timeline(myname), :list_user_timeline)
|
6
|
+
call_commands('list ' + config.user_name)
|
8
7
|
},
|
9
8
|
:help => ['me', 'show my timeline']
|
10
9
|
)
|
File without changes
|
@@ -17,7 +17,7 @@ Termtter::Client.add_hook do |statuses, event, t|
|
|
17
17
|
GC.start
|
18
18
|
elsif !statuses.empty? && event == :update_friends_timeline
|
19
19
|
statuses.reverse.each do |s|
|
20
|
-
req = achar.speak("#{s.
|
20
|
+
req = achar.speak("#{s.user.screen_name}: #{s.text}".tosjis)
|
21
21
|
sleep 3
|
22
22
|
WIN32OLE_EVENT.message_loop
|
23
23
|
achar.stop(req)
|