termtter 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/History.txt +4 -0
  2. data/README.rdoc +97 -0
  3. data/Rakefile +46 -0
  4. data/bin/kill_termtter +22 -0
  5. data/bin/termtter +7 -0
  6. data/lib/filter/en2ja.rb +11 -0
  7. data/lib/filter/english.rb +8 -0
  8. data/lib/filter/expand-tinyurl.rb +24 -0
  9. data/lib/filter/fib.rb +15 -0
  10. data/lib/filter/ignore.rb +19 -0
  11. data/lib/filter/reply.rb +8 -0
  12. data/lib/filter/reverse.rb +13 -0
  13. data/lib/filter/url_addspace.rb +16 -0
  14. data/lib/filter/yhara.rb +20 -0
  15. data/lib/plugin/april_fool.rb +15 -0
  16. data/lib/plugin/bomb.rb +29 -0
  17. data/lib/plugin/clear.rb +14 -0
  18. data/lib/plugin/confirm.rb +9 -0
  19. data/lib/plugin/cool.rb +10 -0
  20. data/lib/plugin/devel.rb +13 -0
  21. data/lib/plugin/english.rb +59 -0
  22. data/lib/plugin/erb.rb +17 -0
  23. data/lib/plugin/favorite.rb +75 -0
  24. data/lib/plugin/fib.rb +8 -0
  25. data/lib/plugin/filter.rb +69 -0
  26. data/lib/plugin/follow.rb +56 -0
  27. data/lib/plugin/graduatter.rb +9 -0
  28. data/lib/plugin/grass.rb +27 -0
  29. data/lib/plugin/group.rb +60 -0
  30. data/lib/plugin/growl.rb +62 -0
  31. data/lib/plugin/hatebu.rb +59 -0
  32. data/lib/plugin/history.rb +82 -0
  33. data/lib/plugin/keyword.rb +18 -0
  34. data/lib/plugin/log.rb +63 -0
  35. data/lib/plugin/modify_arg_hook_sample.rb +7 -0
  36. data/lib/plugin/msagent.rb +26 -0
  37. data/lib/plugin/multi_reply.rb +36 -0
  38. data/lib/plugin/notify-send.rb +17 -0
  39. data/lib/plugin/otsune.rb +21 -0
  40. data/lib/plugin/outputz.rb +35 -0
  41. data/lib/plugin/pause.rb +3 -0
  42. data/lib/plugin/plugin.rb +53 -0
  43. data/lib/plugin/post_exec_hook_sample.rb +9 -0
  44. data/lib/plugin/pre_exec_hook_sample.rb +9 -0
  45. data/lib/plugin/primes.rb +23 -0
  46. data/lib/plugin/quicklook.rb +38 -0
  47. data/lib/plugin/reblog.rb +40 -0
  48. data/lib/plugin/reload.rb +3 -0
  49. data/lib/plugin/say.rb +24 -0
  50. data/lib/plugin/scrape.rb +41 -0
  51. data/lib/plugin/screen.rb +24 -0
  52. data/lib/plugin/shell.rb +14 -0
  53. data/lib/plugin/sl.rb +48 -0
  54. data/lib/plugin/spam.rb +9 -0
  55. data/lib/plugin/standard_plugins.rb +269 -0
  56. data/lib/plugin/stdout.rb +62 -0
  57. data/lib/plugin/system_status.rb +33 -0
  58. data/lib/plugin/translation.rb +28 -0
  59. data/lib/plugin/update_editor.rb +53 -0
  60. data/lib/plugin/uri-open.rb +69 -0
  61. data/lib/plugin/wassr_post.rb +22 -0
  62. data/lib/plugin/yhara.rb +148 -0
  63. data/lib/plugin/yonda.rb +20 -0
  64. data/lib/termtter/api.rb +14 -0
  65. data/lib/termtter/client.rb +399 -0
  66. data/lib/termtter/command.rb +77 -0
  67. data/lib/termtter/connection.rb +39 -0
  68. data/lib/termtter/hook.rb +18 -0
  69. data/lib/termtter/status.rb +26 -0
  70. data/lib/termtter/task.rb +16 -0
  71. data/lib/termtter/task_manager.rb +116 -0
  72. data/lib/termtter/twitter.rb +173 -0
  73. data/lib/termtter/user.rb +13 -0
  74. data/lib/termtter/version.rb +3 -0
  75. data/lib/termtter.rb +157 -0
  76. data/spec/plugin/cool_spec.rb +10 -0
  77. data/spec/plugin/fib_spec.rb +16 -0
  78. data/spec/plugin/filter_spec.rb +18 -0
  79. data/spec/plugin/plugin_spec.rb +25 -0
  80. data/spec/plugin/shell_spec.rb +10 -0
  81. data/spec/plugin/spam_spec.rb +17 -0
  82. data/spec/plugin/standard_plugins_spec.rb +31 -0
  83. data/spec/spec_helper.rb +4 -0
  84. data/spec/termtter/client_spec.rb +175 -0
  85. data/spec/termtter/command_spec.rb +161 -0
  86. data/spec/termtter/task_manager_spec.rb +78 -0
  87. data/spec/termtter/task_spec.rb +22 -0
  88. data/spec/termtter/user_spec.rb +27 -0
  89. data/spec/termtter_spec.rb +43 -0
  90. data/test/friends_timeline.json +5 -0
  91. data/test/search.json +8 -0
  92. data/test/test_termtter.rb +86 -0
  93. metadata +177 -0
@@ -0,0 +1,53 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'tempfile'
4
+
5
+ module Termtter::Client
6
+ if ENV['EDITOR']
7
+ configatron.plugins.update_editor.set_default('editor', ENV['EDITOR'])
8
+ else
9
+ configatron.plugins.update_editor.set_default('editor', 'vi')
10
+ end
11
+ configatron.plugins.update_editor.set_default('add_completion', false)
12
+
13
+
14
+ def self.input_editor
15
+ file = Tempfile.new('termtter')
16
+ editor = configatron.plugins.update_editor.editor
17
+ if configatron.plugins.update_editor.add_completion
18
+ file.puts "\n"*100 + "__END__\n" + public_storage[:users].to_a.join(' ')
19
+ end
20
+ file.close
21
+ system("#{editor} #{file.path}")
22
+ result = file.open.read
23
+ file.close(false)
24
+ result
25
+ end
26
+
27
+ register_command(
28
+ :name => :update_editor, :aliases => [:ue],
29
+ :exec_proc => lambda{|arg|
30
+ pause
31
+ text = input_editor
32
+ unless text.empty?
33
+ text = ERB.new(text).result(binding)
34
+ text.split("\n").each do |post|
35
+ break if post =~ /^__END__$/
36
+ unless post.empty?
37
+ Termtter::API.twitter.update_status(post)
38
+ puts "=> #{post}"
39
+ end
40
+ end
41
+ end
42
+ resume
43
+ },
44
+ :help => ["update_editor,ue", "Update status from editor."]
45
+ )
46
+ end
47
+
48
+ # update_editor.rb
49
+ # update status from editor.
50
+ # example:
51
+ # > update_editor
52
+ # (type your status, save, close the editor)
53
+ # => (your status)
@@ -0,0 +1,69 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module Termtter::Client
4
+ public_storage[:uris] = []
5
+
6
+ add_hook do |statuses, event, t|
7
+ if !statuses.empty? && event == :update_friends_timeline
8
+ statuses.each do |s|
9
+ public_storage[:uris] += s.text.scan(%r|https?://[^\s]+|)
10
+ end
11
+ end
12
+ end
13
+
14
+ def self.open_uri(uri)
15
+ unless configatron.plugins.uri_open.browser.nil?
16
+ system configatron.plugins.uri_open.browser, uri
17
+ else
18
+ case RUBY_PLATFORM
19
+ when /linux/
20
+ system 'firefox', uri
21
+ when /mswin(?!ce)|mingw|bccwin/
22
+ system 'explorer', uri
23
+ else
24
+ system 'open', uri
25
+ end
26
+ end
27
+ end
28
+
29
+ add_command /^uri-open\s*$/ do |m, t|
30
+ public_storage[:uris].each do |uri|
31
+ open_uri(uri)
32
+ end
33
+ public_storage[:uris].clear
34
+ end
35
+
36
+ add_command /^uri-open\s+(\d+)$/ do |m, t|
37
+ if m[1]
38
+ index = m[1].to_i
39
+ open_uri(public_storage[:uris][index])
40
+ public_storage[:uris].delete_at(index)
41
+ end
42
+ end
43
+
44
+ add_command /^uri-open\s+list\s*$/ do |m, t|
45
+ public_storage[:uris].each_with_index do |uri, index|
46
+ puts "#{index}: #{uri}"
47
+ end
48
+ end
49
+
50
+ add_command /^uri-open\s+delete\s+(\d+)$/ do |m, t|
51
+ public_storage[:uris].delete_at(m[1].to_i) if m[1]
52
+ end
53
+
54
+ add_command /^uri-open\s+clear\s*$/ do |m, t|
55
+ public_storage[:uris].clear
56
+ puts "clear uris"
57
+ end
58
+
59
+ add_completion do |input|
60
+ ['uri-open ', 'uri-open list', 'uri-open delete', 'uri-open clear'].grep(/^#{Regexp.quote input}/)
61
+ end
62
+ end
63
+ # ~/.termtter
64
+ # plugin 'uri-open'
65
+ #
66
+ # see also: http://ujihisa.nowa.jp/entry/c3dd00c4e0
67
+ #
68
+ # KNOWN BUG
69
+ # * In Debian, exit or C-c in the termtter kills your firefox.
@@ -0,0 +1,22 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'uri'
4
+ require 'net/http'
5
+
6
+ Termtter::Client.register_hook(
7
+ :name => :wassr_post,
8
+ :points => [:modify_arg_for_update],
9
+ :exec_proc => lambda {|cmd, arg|
10
+ begin
11
+ Net::HTTP.version_1_2
12
+ req = Net::HTTP::Post.new("/statuses/update.json?")
13
+ req.basic_auth configatron.plugins.wassr_post.username, configatron.plugins.wassr_post.password
14
+ Net::HTTP.start('api.wassr.jp', 80) do |http|
15
+ res = http.request(req, "status=#{URI.escape(arg.strip)}&source=Termtter")
16
+ end
17
+ rescue
18
+ puts "RuntimeError: #{$!}"
19
+ end
20
+ return arg
21
+ }
22
+ )
@@ -0,0 +1,148 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ if RUBY_VERSION < "1.8.7"
4
+ class Array
5
+ def choice
6
+ at(rand(size))
7
+ end
8
+ end
9
+ end
10
+
11
+ # based on new-harizon.rb
12
+ module Yharian
13
+
14
+ VOICES =
15
+ %w(Agnes Albert Bad\ News Bahh Bells Boing Bruce Bubbles Cellos Deranged Fred Hysterical Junior Kathy Pipe\ Organ Princess Ralph Trinoids Vicki Victoria Whisper Zarvox)
16
+
17
+
18
+ class Speaker
19
+ attr_reader :name
20
+ def initialize(name)
21
+ @name = name
22
+ end
23
+
24
+ def talk(context)
25
+ n = 7
26
+ words = (0..rand(n)).map { %w[y hara].choice }.
27
+ inject {|r, e| r + (rand < 0.97 ? ' ' : ', ') + e }
28
+ eos = %w(? ? . . . . . . . . !).choice
29
+ [Remark.new(self,words, eos)]
30
+ end
31
+
32
+ def voice(context = nil)
33
+ @name
34
+ end
35
+
36
+ end
37
+
38
+
39
+ class Alex < Speaker
40
+ def initialize
41
+ super 'Alex'
42
+ end
43
+ end
44
+
45
+ class Vicki < Speaker
46
+ def initialize
47
+ super 'Vicki'
48
+ end
49
+ end
50
+
51
+ class Yhara < Speaker
52
+ def initialize
53
+ super 'yhara'
54
+ end
55
+
56
+ def voice(context = nil)
57
+ VOICES.choise
58
+ end
59
+ end
60
+
61
+ class Jenifer < Speaker
62
+ ARABIAN = %w[ايران نيست]
63
+
64
+ def initialize
65
+ super 'jenifer'
66
+ end
67
+
68
+ def talk(context)
69
+ words = (0..rand(3)). map { ARABIAN.choice }.join(' ')
70
+ [Remark.new(self,words, '')]
71
+ end
72
+
73
+ def voice(context = nil)
74
+ 'Princess'
75
+ end
76
+ end
77
+
78
+ class Remark
79
+ attr_reader :speaker, :words, :eos, :pronounciation
80
+
81
+ def initialize(speaker, words, eos, options = {})
82
+ @speaker = speaker
83
+ @words = words
84
+ @eos = eos # end of text : "?" or "." or "!"
85
+ @pronounciation = options[:pronounciation] || text
86
+ end
87
+
88
+ def text
89
+ @words + @eos
90
+ end
91
+
92
+ def interrogative?
93
+ @eos == '?'
94
+ end
95
+
96
+ def display
97
+ puts "#{@speaker.name}: #{text}"
98
+ end
99
+
100
+ def say(context = nil)
101
+ Kernel.say pronounciation, :voice => @speaker.voice(context)
102
+ end
103
+
104
+ def correct?(s)
105
+ s.gsub(/[^yhar]/,'') == @words.gsub(/[^yhar]/,'')
106
+ end
107
+ end
108
+
109
+ @@context = []
110
+ @@speakers = [Alex.new, Vicki.new]
111
+
112
+ def self.text
113
+ if ( @@context.last && Yhara === @@context.last.speaker && rand < 0.25 ) || rand < 0.01
114
+ speaker = Jenifer.new
115
+ elsif @@context.last && @@context.last.words =~ /y hara/ and @@context.last.interrogative? and rand < 0.25
116
+ speaker = Yhara.new
117
+ else
118
+ speaker = @@speakers[rand(2)]
119
+ end
120
+
121
+ remark = speaker.talk(@@context).first
122
+ @@context.push remark
123
+ remark.text
124
+ end
125
+ end
126
+
127
+ module Termtter::Client
128
+ register_command(
129
+ :name => :yhara,
130
+ :exec_proc => lambda{|arg|
131
+ text = "#{'@' if arg[0..0] != '@'}#{arg} #{Yharian::text}"
132
+ Termtter::API.twitter.update_status(text)
133
+ puts "=> #{text}"
134
+ },
135
+ :completion_proc => lambda {|cmd, args|
136
+ if /(.*)@([^\s]*)$/ =~ args
137
+ find_user_candidates $2, "#{cmd} #{$1}@%s"
138
+ end
139
+ },
140
+ :help => ["yhara (USER)", 'Post a new Yharian sentence']
141
+ )
142
+ end
143
+
144
+ # yhara.rb
145
+ # post a new yharian sentence
146
+ # example:
147
+ # > yhara
148
+ # => hara y y hara.
@@ -0,0 +1,20 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module Termtter::Client
4
+ register_command(
5
+ :name => :yonda, :aliases => [:y],
6
+ :exec_proc => proc{|arg|
7
+ public_storage[:unread_count] = 0
8
+ print "\033[2J\033[H" # FIXME
9
+ call_hooks [], :plugin_yonda_yonda
10
+ },
11
+ :help => ['yonda,y', 'Mark as read']
12
+ )
13
+
14
+ add_hook do |statuses, event|
15
+ case event
16
+ when :update_friends_timeline
17
+ public_storage[:unread_count] += statuses.size
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module Termtter
4
+ module API
5
+ class << self
6
+ attr_reader :connection, :twitter
7
+ def setup
8
+ @connection = Connection.new
9
+ @twitter = Termtter::Twitter.new(configatron.user_name, configatron.password, @connection)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ # Termtter::API.connection, Termtter::API.twitter can be accessed.