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.
- 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
|