net-yail 1.6.1 → 1.6.2

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.
@@ -0,0 +1,39 @@
1
+ require 'rubygems'
2
+
3
+ # Want a specific version of net/yail? Try uncommenting this:
4
+ # gem 'net-yail', '1.x.y'
5
+
6
+ require 'net/yail'
7
+ require 'getopt/long'
8
+
9
+ # User specifies channel and nick
10
+ opt = Getopt::Long.getopts(
11
+ ['--network', Getopt::REQUIRED],
12
+ ['--nick', Getopt::REQUIRED],
13
+ ['--port', Getopt::REQUIRED],
14
+ ['--loud', Getopt::BOOLEAN]
15
+ )
16
+
17
+ opts = {
18
+ :address => opt['network'],
19
+ :username => 'FrakkingBot',
20
+ :realname => 'John Botfrakker',
21
+ :nicknames => [opt['nick']],
22
+ }
23
+ opts[:port] = opt['port'] if opt['port']
24
+
25
+ irc = Net::YAIL.new(opts)
26
+
27
+ irc.log.level = Logger::DEBUG if opt['loud']
28
+
29
+ # Register handlers
30
+ irc.heard_welcome { |e| irc.join('#bots') } # Filter - runs after the server's welcome message is read
31
+
32
+ # KICK example - kicks everybody from the channel other than self
33
+ data = {}
34
+ irc.heard_join do |e|
35
+ irc.kick(e.nick, e.channel, "I'm USING THE BATHROOM! Give me a minute!") unless e.nick == irc.me
36
+ end
37
+
38
+ # Start the bot and enjoy the endless loop
39
+ irc.start_listening!
@@ -2,6 +2,7 @@ require 'socket'
2
2
  require 'thread'
3
3
  require 'yaml'
4
4
  require 'logger'
5
+ require 'openssl'
5
6
 
6
7
  # To make this library seem smaller, a lot of code has been split up and put
7
8
  # into semi-logical files. I don't really like this hacky solution, but I
@@ -244,7 +245,7 @@ module Net
244
245
  # contain a comma-separated list of channels, which will restrict the list to the given channels.
245
246
  # If <tt>server</tt> is present, the request is forwarded to the given server.
246
247
  # * <tt>invite(nick, channel)</tt>: Invites a user to the given channel.
247
- # * <tt>kick(nick, channel, [message])</tt>: "KICK :channel :nick", :nick, :channel, :reason, " ::reason"
248
+ # * <tt>kick(nick, channel, [message])</tt>: Kicks the given user from the given channel with an optional message
248
249
  # * <tt>whois(nick, [server]): Issues a WHOIS command for the given nickname with an optional server.
249
250
  #
250
251
  # =Simple Example
@@ -538,7 +539,6 @@ class YAIL
538
539
 
539
540
  # If user asked for SSL, this is where we set it all up
540
541
  def setup_ssl
541
- require 'openssl'
542
542
  ssl_context = OpenSSL::SSL::SSLContext.new()
543
543
  ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
544
544
  @socket = OpenSSL::SSL::SSLSocket.new(@socket, ssl_context)
@@ -553,8 +553,10 @@ class YAIL
553
553
  # Simple non-ssl socket == return a single line
554
554
  return [@socket.gets] unless @ssl
555
555
 
556
- # SSL socket == return all lines available
557
- return @socket.readpartial(OpenSSL::Buffering::BLOCK_SIZE).split($/).collect {|message| message}
556
+ # SSL socket == return all lines available - but preserve newlines for servers that split
557
+ # up words! Newlines tell us where commands end!
558
+ messages = @socket.readpartial(OpenSSL::Buffering::BLOCK_SIZE)
559
+ return messages.split(/(#{$/})/).each_slice(2).map(&:join)
558
560
  end
559
561
 
560
562
  # Reads incoming data - should only be called by io_loop, and only when
@@ -576,6 +578,20 @@ class YAIL
576
578
 
577
579
  # Chomp and push each message
578
580
  for message in messages
581
+ # Message must have one of \r or \n at the end of it, otherwise it's a partial command and
582
+ # we need to hang onto it to join it with the next message
583
+ if message !~ /[\r\n]+$/
584
+ @prepend_message ||= ""
585
+ @prepend_message += message.dup
586
+ next
587
+ end
588
+
589
+ # If we had a partial message recently, attach it to the new message and clear it out
590
+ if @prepend_message
591
+ message = @prepend_message + message
592
+ @prepend_message = nil
593
+ end
594
+
579
595
  message.chomp!
580
596
  @log.debug "+++INCOMING: #{message.inspect}"
581
597
 
@@ -1,5 +1,5 @@
1
1
  module Net
2
2
  class YAIL
3
- VERSION = '1.6.1'
3
+ VERSION = '1.6.2'
4
4
  end
5
5
  end
@@ -46,6 +46,13 @@ class MockIRC
46
46
  return output
47
47
  end
48
48
 
49
+ # Hack for SSL mocking - it's expected tests will set the broken lines however we want them, so
50
+ # this just spits out what gets would have
51
+ def readpartial(size)
52
+ data = gets
53
+ return data || ""
54
+ end
55
+
49
56
  # Hack to let YAIL know if we have data to read
50
57
  def ready?
51
58
  return @output.empty? ? nil : true
@@ -160,4 +167,9 @@ class MockIRC
160
167
  def add_output(*args)
161
168
  args.each {|arg| @output.push(arg + "\n")}
162
169
  end
170
+
171
+ # Sets up our internal string to add a broken line (no newline character)
172
+ def add_partial_output(string)
173
+ @output.push(string)
174
+ end
163
175
  end
@@ -406,4 +406,33 @@ class YailSessionTest < Test::Unit::TestCase
406
406
  assert_equal({:not_bad => 1}, @msg)
407
407
  end
408
408
  end
409
+
410
+ def test_split_messages
411
+ # We have to set up a whole new YAIL for this since split messages only work on SSL
412
+ @yail = Net::YAIL.new(
413
+ :io => @mockirc, :address => "fake-irc.nerdbucket.com", :log => @log,
414
+ :nicknames => ["Bot"], :realname => "Net::YAIL", :username => "Username",
415
+ :use_ssl => true
416
+ )
417
+
418
+ @privmsg = []
419
+ @yail.on_msg { |event| @privmsg.push({:channel => event.channel, :nick => event.nick, :message => event.message}) }
420
+ @mockirc.add_partial_output ":Nerdmaster!nerd@nerdbucket.com PRIVMSG #foosball :First line\n"
421
+ @mockirc.add_partial_output ":Nerdmaster!nerd@n"
422
+ @mockirc.add_partial_output "erdbucket.com PRIVMSG"
423
+ @mockirc.add_partial_output " #foosball :Second line\n:Nerdmaster!nerd@nerdbucket.com PRIVMSG #foosball :Third line\n"
424
+ @yail.start_listening
425
+ wait_for_irc
426
+
427
+ assert_equal(@privmsg.length, 3)
428
+
429
+ 0.upto(2) do |idx|
430
+ assert_equal("Nerdmaster", @privmsg[idx][:nick])
431
+ assert_equal("#foosball", @privmsg[idx][:channel])
432
+ end
433
+
434
+ assert_equal("First line", @privmsg[0][:message])
435
+ assert_equal("Second line", @privmsg[1][:message])
436
+ assert_equal("Third line", @privmsg[2][:message])
437
+ end
409
438
  end
metadata CHANGED
@@ -1,88 +1,102 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: net-yail
3
- version: !ruby/object:Gem::Version
4
- version: 1.6.1
3
+ version: !ruby/object:Gem::Version
4
+ hash: 11
5
5
  prerelease:
6
+ segments:
7
+ - 1
8
+ - 6
9
+ - 2
10
+ version: 1.6.2
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Jeremy Echols
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2013-02-20 00:00:00.000000000 Z
17
+
18
+ date: 2013-04-04 00:00:00 Z
13
19
  dependencies: []
14
- description: ! 'Net::YAIL is an IRC library written in pure Ruby. Using simple functions,
15
- it
16
20
 
21
+ description: |-
22
+ Net::YAIL is an IRC library written in pure Ruby. Using simple functions, it
17
23
  is trivial to build a complex, event-driven IRC application, such as a bot or
18
-
19
24
  even a full command-line client. All events can have a single callback and
20
-
21
25
  any number of before-callback and after-callback filters. Even outgoing events,
22
-
23
26
  such as when you join a channel or send a message, can have filters for stats
24
-
25
- gathering, text filtering, etc.'
27
+ gathering, text filtering, etc.
26
28
  email: yail<at>nerdbucket dot com
27
29
  executables: []
30
+
28
31
  extensions: []
32
+
29
33
  extra_rdoc_files: []
30
- files:
34
+
35
+ files:
31
36
  - examples/simple/dumbbot.rb
32
37
  - examples/simple/whois.rb
33
- - examples/logger/default.yml
38
+ - examples/simple/kick.rb
34
39
  - examples/logger/logger_bot.rb
40
+ - examples/logger/default.yml
35
41
  - examples/logger/run.rb
36
42
  - lib/net/yail.rb
43
+ - lib/net/yail/magic_events.rb
44
+ - lib/net/yail/eventmap.yml
37
45
  - lib/net/yail/IRCBot.rb
46
+ - lib/net/yail/message_parser.rb
38
47
  - lib/net/yail/default_events.rb
39
- - lib/net/yail/dispatch.rb
48
+ - lib/net/yail/output_api.rb
40
49
  - lib/net/yail/event.rb
41
- - lib/net/yail/eventmap.yml
42
- - lib/net/yail/handler.rb
50
+ - lib/net/yail/yail-version.rb
43
51
  - lib/net/yail/irc_bot.rb
44
52
  - lib/net/yail/legacy_events.rb
45
- - lib/net/yail/magic_events.rb
46
- - lib/net/yail/message_parser.rb
47
- - lib/net/yail/output_api.rb
48
53
  - lib/net/yail/report_events.rb
49
- - lib/net/yail/yail-version.rb
54
+ - lib/net/yail/dispatch.rb
55
+ - lib/net/yail/handler.rb
56
+ - tests/net_yail.rb
57
+ - tests/tc_message_parser.rb
50
58
  - tests/tc_event.rb
51
59
  - tests/tc_yail.rb
52
- - tests/tc_message_parser.rb
53
60
  - tests/mock_irc.rb
54
- - tests/net_yail.rb
55
61
  homepage: http://ruby-irc-yail.nerdbucket.com/
56
62
  licenses: []
63
+
57
64
  post_install_message:
58
- rdoc_options:
65
+ rdoc_options:
59
66
  - -m
60
67
  - Net::YAIL
61
68
  - -f
62
69
  - sdoc
63
- require_paths:
70
+ require_paths:
64
71
  - lib
65
- required_ruby_version: !ruby/object:Gem::Requirement
72
+ required_ruby_version: !ruby/object:Gem::Requirement
66
73
  none: false
67
- requirements:
68
- - - ! '>='
69
- - !ruby/object:Gem::Version
70
- version: '0'
71
- required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ hash: 3
78
+ segments:
79
+ - 0
80
+ version: "0"
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
82
  none: false
73
- requirements:
74
- - - ! '>='
75
- - !ruby/object:Gem::Version
76
- version: '0'
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
89
+ version: "0"
77
90
  requirements: []
91
+
78
92
  rubyforge_project: net-yail
79
93
  rubygems_version: 1.8.24
80
94
  signing_key:
81
95
  specification_version: 3
82
- summary: ! 'Yet Another IRC Library: wrapper for IRC communications in Ruby.'
83
- test_files:
96
+ summary: "Yet Another IRC Library: wrapper for IRC communications in Ruby."
97
+ test_files:
98
+ - tests/net_yail.rb
99
+ - tests/tc_message_parser.rb
84
100
  - tests/tc_event.rb
85
101
  - tests/tc_yail.rb
86
- - tests/tc_message_parser.rb
87
102
  - tests/mock_irc.rb
88
- - tests/net_yail.rb