shout-bot 0.0.4 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/shout-bot.rb +77 -0
  2. metadata +30 -12
  3. data/shout-bot.rb +0 -229
data/lib/shout-bot.rb ADDED
@@ -0,0 +1,77 @@
1
+ =begin
2
+ ShoutBot
3
+ Ridiculously simple library to quickly say something on IRC
4
+ <http://github.com/sr/shout-bot>
5
+
6
+ EXAMPLE
7
+
8
+ ShoutBot.shout('irc://shoutbot:password@irc.freenode.net:6667/#github') do |channel|
9
+ channel.say "check me out! http://github.com/sr/shout-bot"
10
+ end
11
+
12
+ LICENSE
13
+
14
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
15
+ Version 2, December 2004
16
+
17
+ Copyright (C) 2008, 2009 Simon Rozet <http://purl.org/net/sr/>
18
+ Copyright (C) 2008, 2009 Harry Vangberg <http://trueaffection.net>
19
+
20
+ Everyone is permitted to copy and distribute verbatim or modified
21
+ copies of this license document, and changing it is allowed as long
22
+ as the name is changed.
23
+
24
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
25
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
26
+
27
+ 0. You just DO WHAT THE FUCK YOU WANT TO.
28
+ =end
29
+
30
+ require "addressable/uri"
31
+ require "socket"
32
+
33
+ class ShoutBot
34
+ def self.shout(uri, password = nil, &block)
35
+ raise ArgumentError unless block_given?
36
+
37
+ uri = Addressable::URI.parse(uri)
38
+ irc = new(uri.host, uri.port, uri.user, uri.password) do |irc|
39
+ if channel = uri.fragment
40
+ irc.join(channel, password, &block)
41
+ else
42
+ irc.channel = uri.path[1..-1]
43
+ yield irc
44
+ end
45
+ end
46
+ end
47
+
48
+ attr_accessor :channel
49
+
50
+ def initialize(server, port, nick, password=nil)
51
+ raise ArgumentError unless block_given?
52
+
53
+ @socket = TCPSocket.open(server, port || 6667)
54
+ @socket.puts "PASSWORD #{password}" if password
55
+ @socket.puts "NICK #{nick}"
56
+ @socket.puts "USER #{nick} #{nick} #{nick} :#{nick}"
57
+ sleep 1
58
+ yield self
59
+ @socket.puts "QUIT"
60
+ @socket.gets until @socket.eof?
61
+ end
62
+
63
+ def join(channel, password = nil)
64
+ raise ArgumentError unless block_given?
65
+ params = channel.split('?')
66
+ @channel = "##{params[0]}"
67
+ @channel_password = params[1] || password || ""
68
+ @socket.puts "JOIN #{@channel} #{@channel_password}"
69
+ yield self
70
+ @socket.puts "PART #{@channel}"
71
+ end
72
+
73
+ def say(message)
74
+ return unless @channel
75
+ @socket.puts "PRIVMSG #{@channel} :#{message}"
76
+ end
77
+ end
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shout-bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ hash: 19
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 6
10
+ version: 0.0.6
5
11
  platform: ruby
6
12
  authors:
7
13
  - Simon Rozet
@@ -10,19 +16,23 @@ autorequire:
10
16
  bindir: bin
11
17
  cert_chain: []
12
18
 
13
- date: 2009-03-02 00:00:00 +01:00
19
+ date: 2011-03-01 00:00:00 +01:00
14
20
  default_executable:
15
21
  dependencies:
16
22
  - !ruby/object:Gem::Dependency
17
23
  name: addressable
18
- type: :runtime
19
- version_requirement:
20
- version_requirements: !ruby/object:Gem::Requirement
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
21
27
  requirements:
22
28
  - - ">="
23
29
  - !ruby/object:Gem::Version
30
+ hash: 3
31
+ segments:
32
+ - 0
24
33
  version: "0"
25
- version:
34
+ type: :runtime
35
+ version_requirements: *id001
26
36
  description: Ridiculously simple library to quickly say something on IRC
27
37
  email: simon@rozet.name
28
38
  executables: []
@@ -32,32 +42,40 @@ extensions: []
32
42
  extra_rdoc_files: []
33
43
 
34
44
  files:
35
- - shout-bot.rb
36
- has_rdoc: false
45
+ - lib/shout-bot.rb
46
+ has_rdoc: true
37
47
  homepage: http://github.com/sr/shout-bot
48
+ licenses: []
49
+
38
50
  post_install_message:
39
51
  rdoc_options: []
40
52
 
41
53
  require_paths:
42
54
  - .
43
55
  required_ruby_version: !ruby/object:Gem::Requirement
56
+ none: false
44
57
  requirements:
45
58
  - - ">="
46
59
  - !ruby/object:Gem::Version
60
+ hash: 3
61
+ segments:
62
+ - 0
47
63
  version: "0"
48
- version:
49
64
  required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
50
66
  requirements:
51
67
  - - ">="
52
68
  - !ruby/object:Gem::Version
69
+ hash: 3
70
+ segments:
71
+ - 0
53
72
  version: "0"
54
- version:
55
73
  requirements: []
56
74
 
57
75
  rubyforge_project:
58
- rubygems_version: 1.3.1
76
+ rubygems_version: 1.6.2
59
77
  signing_key:
60
- specification_version: 2
78
+ specification_version: 3
61
79
  summary: Ridiculously simple library to quickly say something on IRC
62
80
  test_files: []
63
81
 
data/shout-bot.rb DELETED
@@ -1,229 +0,0 @@
1
- =begin
2
- ShoutBot
3
- Ridiculously simple library to quickly say something on IRC
4
- <http://github.com/sr/shout-bot>
5
-
6
- EXAMPLE
7
-
8
- ShoutBot.shout('irc://shoutbot:password@irc.freenode.net:6667/#github') do |channel|
9
- channel.say "check me out! http://github.com/sr/shout-bot"
10
- end
11
-
12
- LICENSE
13
-
14
- DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
15
- Version 2, December 2004
16
-
17
- Copyright (C) 2008, 2009 Simon Rozet <http://purl.org/net/sr/>
18
- Copyright (C) 2008, 2009 Harry Vangberg <http://trueaffection.net>
19
-
20
- Everyone is permitted to copy and distribute verbatim or modified
21
- copies of this license document, and changing it is allowed as long
22
- as the name is changed.
23
-
24
- DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
25
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
26
-
27
- 0. You just DO WHAT THE FUCK YOU WANT TO.
28
- =end
29
-
30
- require "rubygems"
31
- require "addressable/uri"
32
- require "socket"
33
-
34
- class ShoutBot
35
- def self.shout(uri, &block)
36
- raise ArgumentError unless block_given?
37
-
38
- uri = Addressable::URI.parse(uri)
39
- irc = new(uri.host, uri.port, uri.user, uri.password) do |irc|
40
- if channel = uri.fragment
41
- irc.join(channel, &block)
42
- else
43
- irc.channel = uri.path[1..-1]
44
- yield irc
45
- end
46
- end
47
- end
48
-
49
- attr_accessor :channel
50
-
51
- def initialize(server, port, nick, password=nil)
52
- raise ArgumentError unless block_given?
53
-
54
- @socket = TCPSocket.open(server, port || 6667)
55
- @socket.puts "PASSWORD #{password}" if password
56
- @socket.puts "NICK #{nick}"
57
- @socket.puts "USER #{nick} #{nick} #{nick} :#{nick}"
58
- sleep 1
59
- yield self
60
- @socket.puts "QUIT"
61
- @socket.gets until @socket.eof?
62
- end
63
-
64
- def join(channel)
65
- raise ArgumentError unless block_given?
66
-
67
- @channel = "##{channel}"
68
- @socket.puts "JOIN #{@channel}"
69
- yield self
70
- @socket.puts "PART #{@channel}"
71
- end
72
-
73
- def say(message)
74
- return unless @channel
75
- @socket.puts "PRIVMSG #{@channel} :#{message}"
76
- end
77
- end
78
-
79
- if $0 == __FILE__ || $0 == "-e"
80
- require "test/unit"
81
- require "context"
82
- require "rr"
83
-
84
- class MockSocket
85
- attr_accessor :in, :out
86
- def gets() @in.gets end
87
- def puts(m) @out.puts(m) end
88
- def eof?() true end
89
- end
90
-
91
- class ShoutBot
92
- include Test::Unit::Assertions
93
- end
94
-
95
- class Test::Unit::TestCase
96
- include RR::Adapters::TestUnit
97
-
98
- def setup
99
- @socket, @server = MockSocket.new, MockSocket.new
100
- @socket.in, @server.out = IO.pipe
101
- @server.in, @socket.out = IO.pipe
102
-
103
- stub(TCPSocket).open(anything, anything) {@socket}
104
- end
105
- end
106
-
107
- class TestShoutBot < Test::Unit::TestCase
108
- def create_shoutbot(&block)
109
- ShoutBot.new("irc.freenode.net", 6667, "john", &block || lambda {})
110
- end
111
-
112
- def create_shoutbot_and_register(&block)
113
- create_shoutbot &block
114
- 2.times { @server.gets } # NICK + USER
115
- end
116
-
117
- test "raises error if no block given" do
118
- assert_raises ArgumentError do
119
- ShoutBot.new("irc.freenode.net", 6667, "john")
120
- end
121
- end
122
-
123
- test "registers to the irc server" do
124
- create_shoutbot
125
- assert_equal "NICK john\n", @server.gets
126
- assert_equal "USER john john john :john\n", @server.gets
127
- end
128
-
129
- test "sends password if specified" do
130
- # hey, retarded test!
131
- ShoutBot.new("irc.freenode.net", 6667, "john", "malbec") {@socket}
132
- assert_equal "PASSWORD malbec\n", @server.gets
133
- end
134
-
135
- test "falls back to port 6667 if not specified" do
136
- # talk about retarded test
137
- mock(TCPSocket).open("irc.freenode.net", 6667) {@socket}
138
- ShoutBot.new("irc.freenode.net", nil, "john") {}
139
- end
140
-
141
- test "quits after doing its job" do
142
- create_shoutbot_and_register {}
143
- assert_equal "QUIT\n", @server.gets
144
- end
145
-
146
- test "raises error if no block is given to join" do
147
- create_shoutbot do |bot|
148
- assert_raises(ArgumentError) {bot.join "integrity"}
149
- end
150
- end
151
-
152
- test "joins channel" do
153
- create_shoutbot_and_register do |bot|
154
- bot.join("integrity") {}
155
- end
156
- assert_equal "JOIN #integrity\n", @server.gets
157
- end
158
-
159
- test "doesn't do anything until receiving RPL_MYINFO / 004" do
160
- # pending
161
- end
162
-
163
- test "joins channel and says something" do
164
- create_shoutbot_and_register do |bot|
165
- bot.join "integrity" do |c|
166
- c.say "foo bar!"
167
- end
168
- end
169
- @server.gets # JOIN
170
- assert_equal "PRIVMSG #integrity :foo bar!\n", @server.gets
171
- end
172
-
173
- test "sends private message to user" do
174
- create_shoutbot_and_register do |bot|
175
- bot.channel = "sr"
176
- bot.say "Look Ma, new tests!"
177
- end
178
- assert_equal "PRIVMSG sr :Look Ma, new tests!\n", @server.gets
179
- end
180
- end
181
-
182
- class TestShouter < Test::Unit::TestCase
183
- def create_shouter(&block)
184
- shouter = ShoutBot.new("irc.freenode.net", 6667, "shouter") {}
185
- mock(ShoutBot).new(anything, anything, anything, anything).yields(shouter) {shouter}
186
- shouter
187
- end
188
-
189
- test "raises error unless block is given" do
190
- assert_raises ArgumentError do
191
- ShoutBot.shout("irc://shouter@irc.freenode.net:6667/foo")
192
- end
193
- end
194
-
195
- test "creates a new instance of shoutbot" do
196
- mock(ShoutBot).new("irc.freenode.net", 6667, "shouter", nil)
197
- ShoutBot.shout("irc://shouter@irc.freenode.net:6667/foo") {}
198
- end
199
-
200
- test "creates a new instance of shoutbot with password" do
201
- mock(ShoutBot).new("irc.freenode.net", 6667, "shouter", "badass")
202
- ShoutBot.shout("irc://shouter:badass@irc.freenode.net:6667/foo") {}
203
- end
204
-
205
- test "joins channel" do
206
- shouter = create_shouter
207
- mock(shouter).join("integrity")
208
- ShoutBot.shout("irc://shouter@irc.freenode.net:6667/#integrity") {}
209
- end
210
-
211
- test "says stuff in channel" do
212
- shouter = create_shouter
213
- mock(shouter).say("foo bar!")
214
- ShoutBot.shout("irc://shouter@irc.freenode.net:6667/#integrity") do |bot|
215
- bot.say "foo bar!"
216
- end
217
- assert_equal "#integrity", shouter.channel
218
- end
219
-
220
- test "sends private message to nick" do
221
- shouter = create_shouter
222
- mock(shouter).say("foo bar!")
223
- ShoutBot.shout("irc://shouter@irc.freenode.net:6667/harry") do |bot|
224
- bot.say "foo bar!"
225
- end
226
- assert_equal "harry", shouter.channel
227
- end
228
- end
229
- end