jugyo-termtter 0.7.6 → 0.7.7
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 +23 -0
- data/bin/termtter +0 -39
- data/lib/filter/english.rb +1 -1
- data/lib/filter/ignore.rb +17 -0
- data/lib/filter/reply.rb +8 -0
- data/lib/filter/yhara.rb +1 -1
- data/lib/plugin/cool.rb +12 -0
- data/lib/plugin/favorite.rb +10 -7
- data/lib/plugin/fib.rb +1 -0
- data/lib/plugin/follow.rb +2 -2
- data/lib/plugin/graduatter.rb +7 -0
- data/lib/plugin/group.rb +15 -3
- data/lib/plugin/growl.rb +15 -4
- data/lib/plugin/hatebu.rb +57 -0
- data/lib/plugin/history.rb +10 -2
- data/lib/plugin/log.rb +33 -2
- data/lib/plugin/msagent.rb +24 -0
- data/lib/plugin/multi_reply.rb +34 -0
- data/lib/plugin/otsune.rb +17 -0
- data/lib/plugin/outputz.rb +33 -0
- data/lib/plugin/primes.rb +21 -0
- data/lib/plugin/reblog.rb +38 -0
- data/lib/plugin/say.rb +1 -1
- data/lib/plugin/scrape.rb +43 -0
- data/lib/plugin/screen.rb +22 -0
- data/lib/plugin/shell.rb +1 -1
- data/lib/plugin/sl.rb +7 -7
- data/lib/plugin/standard_plugins.rb +100 -48
- data/lib/plugin/stdout.rb +27 -71
- data/lib/plugin/system_status.rb +41 -0
- data/lib/plugin/update_editor.rb +53 -0
- data/lib/plugin/wassr_post.rb +21 -0
- data/lib/plugin/yonda.rb +18 -0
- data/lib/termtter/api.rb +12 -0
- data/lib/termtter/client.rb +298 -0
- data/lib/termtter/command.rb +67 -0
- data/lib/termtter/connection.rb +37 -0
- data/lib/termtter/status.rb +24 -0
- data/lib/termtter/twitter.rb +138 -0
- data/lib/termtter.rb +90 -410
- data/run_termtter.rb +0 -11
- metadata +25 -2
data/Manifest.txt
CHANGED
@@ -8,35 +8,58 @@ lib/filter/en2ja.rb
|
|
8
8
|
lib/filter/english.rb
|
9
9
|
lib/filter/expand-tinyurl.rb
|
10
10
|
lib/filter/fib.rb
|
11
|
+
lib/filter/ignore.rb
|
12
|
+
lib/filter/reply.rb
|
11
13
|
lib/filter/reverse.rb
|
12
14
|
lib/filter/yhara.rb
|
13
15
|
lib/plugin/bomb.rb
|
14
16
|
lib/plugin/confirm.rb
|
17
|
+
lib/plugin/cool.rb
|
15
18
|
lib/plugin/english.rb
|
16
19
|
lib/plugin/erb.rb
|
17
20
|
lib/plugin/favorite.rb
|
18
21
|
lib/plugin/fib.rb
|
19
22
|
lib/plugin/filter.rb
|
20
23
|
lib/plugin/follow.rb
|
24
|
+
lib/plugin/graduatter.rb
|
21
25
|
lib/plugin/group.rb
|
22
26
|
lib/plugin/growl.rb
|
27
|
+
lib/plugin/hatebu.rb
|
23
28
|
lib/plugin/history.rb
|
24
29
|
lib/plugin/keyword.rb
|
25
30
|
lib/plugin/log.rb
|
31
|
+
lib/plugin/msagent.rb
|
32
|
+
lib/plugin/multi_reply.rb
|
26
33
|
lib/plugin/notify-send.rb
|
34
|
+
lib/plugin/otsune.rb
|
35
|
+
lib/plugin/outputz.rb
|
27
36
|
lib/plugin/plugin.rb
|
37
|
+
lib/plugin/primes.rb
|
28
38
|
lib/plugin/quicklook.rb
|
39
|
+
lib/plugin/reblog.rb
|
29
40
|
lib/plugin/reload.rb
|
30
41
|
lib/plugin/say.rb
|
42
|
+
lib/plugin/scrape.rb
|
43
|
+
lib/plugin/screen.rb
|
31
44
|
lib/plugin/shell.rb
|
32
45
|
lib/plugin/sl.rb
|
33
46
|
lib/plugin/spam.rb
|
34
47
|
lib/plugin/standard_plugins.rb
|
35
48
|
lib/plugin/stdout.rb
|
49
|
+
lib/plugin/system_status.rb
|
36
50
|
lib/plugin/translation.rb
|
51
|
+
lib/plugin/update_editor.rb
|
37
52
|
lib/plugin/uri-open.rb
|
53
|
+
lib/plugin/wassr_post.rb
|
38
54
|
lib/plugin/yhara.rb
|
55
|
+
lib/plugin/yonda.rb
|
39
56
|
lib/termtter.rb
|
57
|
+
lib/termtter/api.rb
|
58
|
+
lib/termtter/client.rb
|
59
|
+
lib/termtter/command.rb
|
60
|
+
lib/termtter/connection.rb
|
61
|
+
lib/termtter/status.rb
|
62
|
+
lib/termtter/twitter.rb
|
40
63
|
run_termtter.rb
|
41
64
|
test/friends_timeline.json
|
42
65
|
test/search.json
|
data/bin/termtter
CHANGED
@@ -3,44 +3,5 @@
|
|
3
3
|
$KCODE = 'u'
|
4
4
|
|
5
5
|
require 'rubygems'
|
6
|
-
require 'configatron'
|
7
|
-
require 'highline'
|
8
6
|
require 'termtter'
|
9
|
-
plugin 'standard_plugins'
|
10
|
-
plugin 'stdout'
|
11
|
-
|
12
|
-
conf_file = File.expand_path('~/.termtter')
|
13
|
-
if File.exist? conf_file
|
14
|
-
load conf_file
|
15
|
-
else
|
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
|
-
|
21
|
-
File.open(File.expand_path('~/.termtter'), 'w') {|io|
|
22
|
-
plugins = Dir.glob(File.dirname(__FILE__) + "/../lib/plugin/*.rb").map {|f|
|
23
|
-
f.match(%r|lib/plugin/(.*?).rb$|)[1]
|
24
|
-
}
|
25
|
-
plugins -= %w[stdout standard_plugins]
|
26
|
-
plugins.each do |p|
|
27
|
-
io.puts "#plugin '#{p}'"
|
28
|
-
end
|
29
|
-
|
30
|
-
io.puts
|
31
|
-
io.puts "configatron.user_name = '#{username}'"
|
32
|
-
io.puts "configatron.password = '#{password}'"
|
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'"
|
38
|
-
io.puts
|
39
|
-
io.puts "# vim: set filetype=ruby"
|
40
|
-
}
|
41
|
-
puts "generated: ~/.termtter"
|
42
|
-
puts "enjoy!"
|
43
|
-
load conf_file
|
44
|
-
end
|
45
|
-
|
46
7
|
Termtter::Client.run
|
data/lib/filter/english.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
configatron.filters.ignore.set_default(:words, [])
|
3
|
+
|
4
|
+
module Termtter::Client
|
5
|
+
add_filter do |statuses|
|
6
|
+
ignore_words = configatron.filters.ignore.words
|
7
|
+
statuses.delete_if do |s|
|
8
|
+
ignore_words.any? {|i| i =~ s.text }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# filter/ignore.rb
|
14
|
+
# ignore words
|
15
|
+
# setting
|
16
|
+
# configatron.filters.ignore.words = [ /ignore/, /words/ ]
|
17
|
+
|
data/lib/filter/reply.rb
ADDED
data/lib/filter/yhara.rb
CHANGED
data/lib/plugin/cool.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module Termtter::Client
|
2
|
+
add_help 'cool {SCREENNAME}', 'update "@{SCREENNAME} cool."'
|
3
|
+
add_macro /^cool ([^\s]*)/, "update @%s cool."
|
4
|
+
add_completion do |input|
|
5
|
+
case input
|
6
|
+
when /^c$/
|
7
|
+
['cool']
|
8
|
+
when /^cool ([^\s]*)/
|
9
|
+
find_user_candidates $1, "cool %s"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/plugin/favorite.rb
CHANGED
@@ -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+)
|
4
|
+
add_command %r'^(?:favorite|fav)\s+(\d+)\s*$' do |m, t|
|
5
5
|
id = m[1]
|
6
6
|
res = t.favorite(id)
|
7
7
|
if res.code == '200'
|
@@ -13,14 +13,15 @@ module Termtter::Client
|
|
13
13
|
|
14
14
|
add_help 'favorite,fav USER', 'Favorite last status on the user'
|
15
15
|
|
16
|
-
add_command %r'^(?:favorite|fav)\s+@(.+)
|
17
|
-
user = m[1]
|
16
|
+
add_command %r'^(?:favorite|fav)\s+@(.+)\s*$' do |m, t|
|
17
|
+
user = m[1].strip
|
18
18
|
statuses = t.get_user_timeline(user)
|
19
19
|
unless statuses.empty?
|
20
20
|
id = statuses[0].id
|
21
|
+
text = statuses[0].text
|
21
22
|
res = t.favorite(id)
|
22
23
|
if res.code == '200'
|
23
|
-
puts
|
24
|
+
puts %Q(Favorited last status ##{id} on user @#{user}: "#{text}")
|
24
25
|
else
|
25
26
|
puts "Failed: #{res}"
|
26
27
|
end
|
@@ -49,8 +50,10 @@ module Termtter::Client
|
|
49
50
|
|
50
51
|
add_completion do |input|
|
51
52
|
case input
|
52
|
-
when /^(favorite|fav)
|
53
|
+
when /^(favorite|fav)\s+@(.*)/
|
53
54
|
find_user_candidates $2, "#{$1} @%s"
|
55
|
+
when /^(favorite|fav)\s+(\d*)/
|
56
|
+
find_status_id_candidates $2, "#{$1} %s"
|
54
57
|
else
|
55
58
|
%w(favorite).grep(/^#{Regexp.quote input}/)
|
56
59
|
end
|
@@ -60,9 +63,9 @@ end
|
|
60
63
|
module Termtter
|
61
64
|
class Twitter
|
62
65
|
def favorite(id)
|
63
|
-
uri = "
|
66
|
+
uri = "#{@connection.protocol}://twitter.com/favourings/create/#{id}.json"
|
64
67
|
|
65
|
-
|
68
|
+
@connection.start('twitter.com', @connection.port) do |http|
|
66
69
|
http.request(post_request(uri))
|
67
70
|
end
|
68
71
|
end
|
data/lib/plugin/fib.rb
CHANGED
@@ -3,3 +3,4 @@ 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
4
|
puts"=> #{x}"end
|
5
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
|
6
|
+
# TODO: use add_macro
|
data/lib/plugin/follow.rb
CHANGED
@@ -30,9 +30,9 @@ module Termtter
|
|
30
30
|
when :follow then 'create'
|
31
31
|
when :leave then 'destroy'
|
32
32
|
end
|
33
|
-
uri = "
|
33
|
+
uri = "#{@connection.protocol}://twitter.com/friendships/#{type}/#{user}.json"
|
34
34
|
|
35
|
-
|
35
|
+
@connection.start('twitter.com', @connection.port) do |http|
|
36
36
|
http.request(post_request(uri))
|
37
37
|
end
|
38
38
|
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
twitter = Termtter::Twitter.new(configatron.user_name, configatron.password)
|
2
|
+
Thread.start do
|
3
|
+
100.times do |i|
|
4
|
+
twitter.update_status(
|
5
|
+
"I decided not to use twitter so as not to leave university before I complete the dissertation#{i.odd? ? '!' : '.'}")
|
6
|
+
end
|
7
|
+
end
|
data/lib/plugin/group.rb
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
configatron.set_default('plugins.group.groups', {})
|
2
2
|
|
3
|
+
module Termtter
|
4
|
+
class Status
|
5
|
+
def is_member?(group = nil)
|
6
|
+
if group
|
7
|
+
configatron.plugins.group.groups[:group].include? self.user_screen_name
|
8
|
+
else
|
9
|
+
configatron.plugins.group.groups.values.flatten.include? self.user_screen_name
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
3
15
|
module Termtter::Client
|
4
16
|
if public_storage[:log]
|
5
17
|
add_help 'group,g GROUPNAME', 'Filter by group members'
|
@@ -16,7 +28,7 @@ module Termtter::Client
|
|
16
28
|
statuses = group ? public_storage[:log].select { |s|
|
17
29
|
group.include?(s.user_screen_name)
|
18
30
|
} : []
|
19
|
-
call_hooks(statuses, :
|
31
|
+
call_hooks(statuses, :search, t)
|
20
32
|
end
|
21
33
|
|
22
34
|
def self.find_group_candidates(a, b)
|
@@ -27,7 +39,7 @@ module Termtter::Client
|
|
27
39
|
|
28
40
|
add_completion do |input|
|
29
41
|
case input
|
30
|
-
when /^(group|g)
|
42
|
+
when /^(group|g)\s+(.+)/
|
31
43
|
find_group_candidates($2, "#{$1} %s")
|
32
44
|
when /^(group|g)\s+$/
|
33
45
|
configatron.plugins.group.groups.keys
|
@@ -41,6 +53,6 @@ end
|
|
41
53
|
# group.rb
|
42
54
|
# plugin 'group'
|
43
55
|
# configatron.plugins.group.groups = {
|
44
|
-
#
|
56
|
+
# :rits => %w(hakobe isano hitode909)
|
45
57
|
# }
|
46
58
|
# NOTE: group.rb needs plugin/log
|
data/lib/plugin/growl.rb
CHANGED
@@ -3,6 +3,13 @@ require 'open-uri'
|
|
3
3
|
require 'uri'
|
4
4
|
require 'fileutils'
|
5
5
|
|
6
|
+
begin
|
7
|
+
require 'ruby-growl'
|
8
|
+
growl = Growl.new "localhost", "termtter", "termtter status notification"
|
9
|
+
rescue LoadError
|
10
|
+
growl = nil
|
11
|
+
end
|
12
|
+
|
6
13
|
configatron.plugins.growl.set_default(:icon_cache_dir, "#{Dir.tmpdir}/termtter-icon-cache-dir")
|
7
14
|
FileUtils.mkdir_p(configatron.plugins.growl.icon_cache_dir) unless File.exist?(configatron.plugins.growl.icon_cache_dir)
|
8
15
|
|
@@ -27,10 +34,14 @@ Thread.new do
|
|
27
34
|
loop do
|
28
35
|
begin
|
29
36
|
if s = queue.pop
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
37
|
+
unless growl
|
38
|
+
arg = ['growlnotify', s.user_screen_name, '-m', s.text.gsub("\n",''), '-n', 'termtter']
|
39
|
+
#icon_path = get_icon_path(s)
|
40
|
+
#arg += ['--image', icon_path] if icon_path
|
41
|
+
system *arg
|
42
|
+
else
|
43
|
+
growl.notify "termtter status notification", s.text, s.user_screen_name
|
44
|
+
end
|
34
45
|
end
|
35
46
|
rescue => e
|
36
47
|
puts e
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'atomutil'
|
3
|
+
|
4
|
+
module Termtter::Client
|
5
|
+
add_help 'hatebu ID', 'Hatena bookmark a status'
|
6
|
+
|
7
|
+
add_command %r'^hatebu\s+(\d+)(.*)$' do |m, t|
|
8
|
+
id = m[1]
|
9
|
+
comment = m[2].strip
|
10
|
+
statuses = public_storage[:log].select { |s| s.id == id }
|
11
|
+
unless statuses.empty?
|
12
|
+
status = statuses.first
|
13
|
+
else
|
14
|
+
status = t.show(id).first
|
15
|
+
end
|
16
|
+
auth = auth = Atompub::Auth::Wsse.new({
|
17
|
+
:username => configatron.plugins.hatebu.username,
|
18
|
+
:password => configatron.plugins.hatebu.password,
|
19
|
+
})
|
20
|
+
link = Atom::Link.new({
|
21
|
+
:href => "http://twitter.com/#{status.user_screen_name}/status/#{status.id}",
|
22
|
+
:rel => 'related',
|
23
|
+
:type => 'text/html',
|
24
|
+
})
|
25
|
+
entry = Atom::Entry.new({
|
26
|
+
:link => link,
|
27
|
+
:title => 'dummy',
|
28
|
+
:summary => comment,
|
29
|
+
})
|
30
|
+
req = Net::HTTP::Post.new 'http://b.hatena.ne.jp/atom/post'
|
31
|
+
req['User-Agent'] = 'Mozilla/5.0'
|
32
|
+
req['Content-Type'] = 'application/atom+xml'
|
33
|
+
req['Slug'] = 'termtter'
|
34
|
+
req.body = entry.to_s
|
35
|
+
auth.authorize(req)
|
36
|
+
Net::HTTP.start('b.hatena.ne.jp', 80) do |http|
|
37
|
+
res = http.request(req)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
add_completion do |input|
|
42
|
+
case input
|
43
|
+
when /^(hatebu)\s+(\d*)$/
|
44
|
+
find_status_id_candidates $2, "#{$1} %s"
|
45
|
+
else
|
46
|
+
%w(hatebu).grep(/^#{Regexp.quote input}/)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# hatebu.rb
|
52
|
+
# hatena bookmark it!
|
53
|
+
#
|
54
|
+
# configatron.plugins.hatebu.username = 'your-username-on-hatena'
|
55
|
+
# configatron.plugins.hatebu.password = 'your-password-on-hatena'
|
56
|
+
#
|
57
|
+
# hatebu 1114860346 [termtter][����͂�����]mattn++
|
data/lib/plugin/history.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'zlib'
|
2
2
|
|
3
3
|
configatron.plugins.history.
|
4
|
-
set_default(
|
4
|
+
set_default(:filename, '~/.termtter_history')
|
5
5
|
configatron.plugins.history.
|
6
|
-
set_default(
|
6
|
+
set_default(:keys, [:log, :users, :status_ids])
|
7
|
+
configatron.plugins.history.
|
8
|
+
set_default(:max_of_history, 100)
|
7
9
|
|
8
10
|
module Termtter::Client
|
9
11
|
def self.load_history
|
@@ -20,6 +22,7 @@ module Termtter::Client
|
|
20
22
|
keys.each do |key|
|
21
23
|
public_storage[key] = history[key] if history[key]
|
22
24
|
end
|
25
|
+
Readline::HISTORY.push *history[:history] if history[:history]
|
23
26
|
puts "history loaded(#{File.size(filename)}bytes)"
|
24
27
|
end
|
25
28
|
end
|
@@ -32,6 +35,11 @@ module Termtter::Client
|
|
32
35
|
keys.each do |key|
|
33
36
|
history[key] = public_storage[key]
|
34
37
|
end
|
38
|
+
max_of_history = configatron.plugins.history.max_of_history
|
39
|
+
history[:history] = Readline::HISTORY.to_a.reverse.uniq.reverse
|
40
|
+
if history[:history].size > max_of_history
|
41
|
+
history[:history] = history[:history][-max_of_history..-1]
|
42
|
+
end
|
35
43
|
|
36
44
|
File.open(filename, 'w') do |f|
|
37
45
|
f.write Zlib::Deflate.deflate(Marshal.dump(history))
|
data/lib/plugin/log.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
module Termtter::Client
|
2
2
|
public_storage[:log] = []
|
3
3
|
configatron.plugins.log.set_default('max_size', 1/0.0)
|
4
|
+
configatron.plugins.log.set_default('print_max_size', 30)
|
4
5
|
|
5
6
|
add_help '/WORD', 'Search log for WORD'
|
7
|
+
add_help 'log', 'Show local log'
|
8
|
+
add_help 'log (USER(S)) (MAX)', 'Show local log of the user(s)'
|
6
9
|
|
7
10
|
add_hook do |statuses, event|
|
8
11
|
case event
|
9
|
-
when :
|
12
|
+
when :pre_filter
|
10
13
|
public_storage[:log] += statuses
|
11
14
|
max_size = configatron.plugins.log.max_size
|
12
15
|
if public_storage[:log].size > max_size
|
@@ -19,6 +22,34 @@ module Termtter::Client
|
|
19
22
|
add_command %r'^/(.+)' do |m, t|
|
20
23
|
pat = Regexp.new(m[1])
|
21
24
|
statuses = public_storage[:log].select { |s| s.text =~ pat }
|
22
|
-
call_hooks(statuses, :
|
25
|
+
call_hooks(statuses, :search, t)
|
23
26
|
end
|
27
|
+
|
28
|
+
# log
|
29
|
+
add_command /^(log)\s*$/ do |m, t|
|
30
|
+
statuses = public_storage[:log]
|
31
|
+
print_max = configatron.plugins.log.print_max_size
|
32
|
+
print_max = 0 if statuses.size < print_max
|
33
|
+
call_hooks(statuses[-print_max..-1], :search, t)
|
34
|
+
end
|
35
|
+
|
36
|
+
# log (user) (max)
|
37
|
+
add_command /^(log)\s+(.+)\s*/ do |m, t|
|
38
|
+
vars = m[2].split(' ')
|
39
|
+
print_max = vars.last =~ /^\d+$/ ? vars.pop.to_i : configatron.plugins.log.print_max_size
|
40
|
+
id = vars
|
41
|
+
statuses = id.first ? public_storage[:log].select{ |s| id.include? s.user_screen_name} : public_storage[:log]
|
42
|
+
print_max = 0 if statuses.size < print_max
|
43
|
+
call_hooks(statuses[-print_max..-1], :search, t)
|
44
|
+
end
|
45
|
+
|
46
|
+
add_completion do |input|
|
47
|
+
case input
|
48
|
+
when /^(log)\s+(.*)/
|
49
|
+
find_user_candidates $2, "#{$1} %s"
|
50
|
+
else
|
51
|
+
%w[ log ].grep(/^#{Regexp.quote input}/)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
24
55
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
raise 'msagent.rb runs only in windows' if RUBY_PLATFORM.downcase !~ /mswin(?!ce)|mingw|bccwin/
|
2
|
+
require 'win32ole'
|
3
|
+
require 'kconv'
|
4
|
+
|
5
|
+
agent = WIN32OLE.new('Agent.Control.2')
|
6
|
+
agent.connected = true
|
7
|
+
agent.characters.load("Merlin", ENV['WINDIR'] + "\\msagent\\chars\\Merlin.acs")
|
8
|
+
achar = agent.characters.character("Merlin")
|
9
|
+
achar.languageID = 0x411
|
10
|
+
achar.show
|
11
|
+
|
12
|
+
Termtter::Client.add_hook do |statuses, event, t|
|
13
|
+
if event == :exit
|
14
|
+
achar.hide
|
15
|
+
GC.start
|
16
|
+
elsif !statuses.empty? && event == :update_friends_timeline
|
17
|
+
statuses.reverse.each do |s|
|
18
|
+
req = achar.speak("#{s.user_screen_name}: #{s.text}".tosjis)
|
19
|
+
sleep 3
|
20
|
+
WIN32OLE_EVENT.message_loop
|
21
|
+
achar.stop(req)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Termtter::Client
|
2
|
+
add_help 'multi_reply, mp TEXT', 'reply to multi user'
|
3
|
+
add_command /^(multi_reply|mr)\s+(.*)/ do |m, t|
|
4
|
+
text = ERB.new(m[2]).result(binding).gsub(/\n/, ' ')
|
5
|
+
unless text.empty?
|
6
|
+
#targets, _, msg = text.match /(@(.+))*\s+(.+)/
|
7
|
+
#targets.split(/\s+/).
|
8
|
+
# map {|u| "#{u} #{msg}" }.
|
9
|
+
# each do |post|
|
10
|
+
# t.update_status(post)
|
11
|
+
# puts "=> #{post}"
|
12
|
+
# end
|
13
|
+
/(@(.+))*\s+(.+)/ =~ text
|
14
|
+
if $1
|
15
|
+
msg = $3
|
16
|
+
text = $1.split(/\s+/).map {|u| "#{u} #{msg}" }
|
17
|
+
end
|
18
|
+
Array(text).each do |post|
|
19
|
+
t.update_status(post)
|
20
|
+
puts "=> #{post}"
|
21
|
+
end
|
22
|
+
#
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
add_completion do |input|
|
27
|
+
case input
|
28
|
+
when /^(multi_reply|mr)\s+(.*)@([^\s]*)$/
|
29
|
+
find_user_candidates $3, "#{$1} #{$2}@%s"
|
30
|
+
else
|
31
|
+
%w[ mreply mp ].grep(/^#{Regexp.quote input}/)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Termtter::Client
|
2
|
+
add_help 'otsune {SCREENNAME}', 'update "@{SCREENNAME} 頭蓋骨の中身がお気の毒です"'
|
3
|
+
add_help 'otsnue {SCREENNAME}', 'update "@{SCREENNAME} 頭が気の毒です"'
|
4
|
+
|
5
|
+
add_macro /^otsune ([^\s]*)/, "update @%s 頭蓋骨の中身がお気の毒です."
|
6
|
+
add_macro /^otsnue ([^\s]*)/, "update @%s 頭が気の毒です."
|
7
|
+
|
8
|
+
add_completion do |input|
|
9
|
+
case input
|
10
|
+
when /^(otsune|otsnue) ([^\s]*)/
|
11
|
+
find_user_candidates $2, "#{$1} %s"
|
12
|
+
else
|
13
|
+
%w[otsune otsnue].grep(/^#{Regexp.quote input}/)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
# vim: fenc=utf8
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
module Termtter::Client
|
3
|
+
configatron.plugins.outputz.set_default(:uri, 'termtter://twitter.com/status/update')
|
4
|
+
|
5
|
+
key = configatron.plugins.outputz.secret_key
|
6
|
+
if key.instance_of? Configatron::Store
|
7
|
+
puts 'Need your secret key'
|
8
|
+
puts 'please set configatron.plugins.outputz.secret_key'
|
9
|
+
else
|
10
|
+
add_command /^(update|u)\s+(.*)/ do |m, t|
|
11
|
+
text = ERB.new(m[2]).result(binding).gsub(/\n/, ' ')
|
12
|
+
unless text.empty?
|
13
|
+
t.update_status(text)
|
14
|
+
puts "=> #{text}"
|
15
|
+
end
|
16
|
+
t.instance_variable_get('@connection').
|
17
|
+
start('outputz.com', 80) do |http|
|
18
|
+
key = CGI.escape key
|
19
|
+
uri = CGI.escape configatron.plugins.outputz.uri
|
20
|
+
size = text.split(//).size
|
21
|
+
http.post('/api/post', "key=#{key}&uri=#{uri}&size=#{size}")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# outputz.rb
|
28
|
+
# a plugin that report to outputz your post
|
29
|
+
#
|
30
|
+
# settings (note: must this order)
|
31
|
+
# configatron.plugins.outputz.secret_key = 'your secret key'
|
32
|
+
# plugin 'outputz'
|
33
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
def primes(n)
|
2
|
+
table = []
|
3
|
+
(2 .. n).each do |i|
|
4
|
+
table << i
|
5
|
+
end
|
6
|
+
|
7
|
+
prime = []
|
8
|
+
loop do
|
9
|
+
prime << table[0]
|
10
|
+
table = table.delete_if {|x| x % prime.max == 0 }
|
11
|
+
break if table.max < (prime.max ** 2)
|
12
|
+
end
|
13
|
+
|
14
|
+
r = (table+prime).sort {|a, b| a<=>b }
|
15
|
+
r.join(', ')
|
16
|
+
end
|
17
|
+
|
18
|
+
module Termtter::Client
|
19
|
+
add_command /^primes\s(\d+)/ do|m,t|t.update_status x="primes(#{n=m[1].to_i}) = {#{primes n}}"
|
20
|
+
puts "=> #{x}" end
|
21
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'tumblr'
|
3
|
+
|
4
|
+
module Termtter::Client
|
5
|
+
add_help 'reblog ID', 'Tumblr Reblog a status'
|
6
|
+
|
7
|
+
add_command %r'^reblog\s+(\d+)(.*)$' do |m, t|
|
8
|
+
id = m[1]
|
9
|
+
comment = m[2].strip
|
10
|
+
statuses = public_storage[:log].select { |s| s.id == id }
|
11
|
+
unless statuses.empty?
|
12
|
+
status = statuses.first
|
13
|
+
else
|
14
|
+
status = t.show(id).first
|
15
|
+
end
|
16
|
+
|
17
|
+
Tumblr::API.write(configatron.plugins.reblog.email, configatron.plugins.reblog.password) do
|
18
|
+
quote("#{status.text}", "<a href=\"http://twitter.com/#{status.user_screen_name}/status/#{status.id}\">Twitter / #{status.user_name}</a>")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
add_completion do |input|
|
23
|
+
case input
|
24
|
+
when /^(reblog)\s+(\d*)$/
|
25
|
+
find_status_id_candidates $2, "#{$1} %s"
|
26
|
+
else
|
27
|
+
%w(reblog).grep(/^#{Regexp.quote input}/)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# reblog.rb
|
33
|
+
# tumblr reblog it!
|
34
|
+
#
|
35
|
+
# configatron.plugins.reblog.email = 'your-email-on-tumblr'
|
36
|
+
# configatron.plugins.reblog.password = 'your-password-on-tumblr'
|
37
|
+
#
|
38
|
+
# reblog 1114860346
|
data/lib/plugin/say.rb
CHANGED
@@ -2,7 +2,7 @@ raise 'say.rb runs only in OSX Leopard' if /darwin9/ !~ RUBY_PLATFORM
|
|
2
2
|
|
3
3
|
# say :: String -> String -> IO ()
|
4
4
|
def say(who, what)
|
5
|
-
voices = %w(Alex Bruce Fred
|
5
|
+
voices = %w(Alex Alex Bruce Fred Ralph Agnes Kathy Vicki)
|
6
6
|
voice = voices[who.hash % voices.size]
|
7
7
|
system 'say', '-v', voice, what
|
8
8
|
end
|