net-yail 1.4.0 → 1.4.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.
- data/examples/logger/logger_bot.rb +1 -1
- data/lib/net/yail.rb +57 -16
- data/lib/net/yail/IRCBot.rb +5 -152
- data/lib/net/yail/irc_bot.rb +155 -0
- data/lib/net/yail/output_api.rb +4 -4
- data/lib/net/yail/yail-version.rb +1 -1
- data/tests/tc_event.rb +7 -0
- metadata +4 -3
    
        data/lib/net/yail.rb
    CHANGED
    
    | @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            require 'socket'
         | 
| 2 2 | 
             
            require 'thread'
         | 
| 3 3 | 
             
            require 'yaml'
         | 
| 4 | 
            +
            require 'logger'
         | 
| 4 5 |  | 
| 5 6 | 
             
            # To make this library seem smaller, a lot of code has been split up and put
         | 
| 6 7 | 
             
            # into semi-logical files.  I don't really like this hacky solution, but I
         | 
| @@ -242,11 +243,28 @@ class YAIL | |
| 242 243 | 
             
                :socket             # TCPSocket instance
         | 
| 243 244 | 
             
              )
         | 
| 244 245 | 
             
              attr_accessor(
         | 
| 245 | 
            -
                : | 
| 246 | 
            -
                : | 
| 247 | 
            -
                :throttle_seconds
         | 
| 246 | 
            +
                :throttle_seconds,
         | 
| 247 | 
            +
                :log
         | 
| 248 248 | 
             
              )
         | 
| 249 249 |  | 
| 250 | 
            +
              def silent
         | 
| 251 | 
            +
                @log.warn '[DEPRECATED] - Net::YAIL#silent is deprecated as of 1.4.1'
         | 
| 252 | 
            +
                return @log_silent
         | 
| 253 | 
            +
              end
         | 
| 254 | 
            +
              def silent=(val)
         | 
| 255 | 
            +
                @log.warn '[DEPRECATED] - Net::YAIL#silent= is deprecated as of 1.4.1'
         | 
| 256 | 
            +
                @log_silent = val
         | 
| 257 | 
            +
              end
         | 
| 258 | 
            +
             | 
| 259 | 
            +
              def loud
         | 
| 260 | 
            +
                @log.warn '[DEPRECATED] - Net::YAIL#loud is deprecated as of 1.4.1'
         | 
| 261 | 
            +
                return @log_loud
         | 
| 262 | 
            +
              end
         | 
| 263 | 
            +
              def loud=(val)
         | 
| 264 | 
            +
                @log.warn '[DEPRECATED] - Net::YAIL#loud= is deprecated as of 1.4.1'
         | 
| 265 | 
            +
                @log_loud = val
         | 
| 266 | 
            +
              end
         | 
| 267 | 
            +
             | 
| 250 268 | 
             
              # Makes a new instance, obviously.
         | 
| 251 269 | 
             
              #
         | 
| 252 270 | 
             
              # Note: I haven't done this everywhere, but for the constructor, I felt
         | 
| @@ -259,15 +277,19 @@ class YAIL | |
| 259 277 | 
             
              # * <tt>:username</tt>: Username reported to server
         | 
| 260 278 | 
             
              # * <tt>:realname</tt>: Real name reported to server
         | 
| 261 279 | 
             
              # * <tt>:nicknames</tt>: Array of nicknames to cycle through
         | 
| 262 | 
            -
              # * <tt>:silent</tt>:  | 
| 263 | 
            -
              #    | 
| 264 | 
            -
              # * <tt>:loud</tt>:  | 
| 265 | 
            -
              #   is  | 
| 280 | 
            +
              # * <tt>:silent</tt>: DEPRECATED - Sets Logger level to FATAL and silences most non-Logger
         | 
| 281 | 
            +
              #   messages.
         | 
| 282 | 
            +
              # * <tt>:loud</tt>: DEPRECATED - Sets Logger level to DEBUG. Spits out too many messages for your own good,
         | 
| 283 | 
            +
              #   and really is only useful when debugging YAIL.  Defaults to false, thankfully.
         | 
| 266 284 | 
             
              # * <tt>:throttle_seconds</tt>: Seconds between a cycle of privmsg sends.
         | 
| 267 285 | 
             
              #   Defaults to 1.  One "cycle" is defined as sending one line of output to
         | 
| 268 286 | 
             
              #   *all* targets that have output buffered.
         | 
| 269 287 | 
             
              # * <tt>:server_password</tt>: Very optional.  If set, this is the password
         | 
| 270 288 | 
             
              #   sent out to the server before USER and NICK messages.
         | 
| 289 | 
            +
              # * <tt>:log</tt>: Optional, if set uses this logger instead of the default (Ruby's Logger).
         | 
| 290 | 
            +
              #   If set, :loud and :silent options are ignored.
         | 
| 291 | 
            +
              # * <tt>:log_io</tt>: Optional, ignored if you specify your own :log - sends given object to
         | 
| 292 | 
            +
              #   Logger's constructor.  Must be filename or IO object.
         | 
| 271 293 | 
             
              def initialize(options = {})
         | 
| 272 294 | 
             
                @me                 = ''
         | 
| 273 295 | 
             
                @nicknames          = options[:nicknames]
         | 
| @@ -276,11 +298,27 @@ class YAIL | |
| 276 298 | 
             
                @realname           = options[:realname]
         | 
| 277 299 | 
             
                @address            = options[:address]
         | 
| 278 300 | 
             
                @port               = options[:port] || 6667
         | 
| 279 | 
            -
                @ | 
| 280 | 
            -
                @ | 
| 301 | 
            +
                @log_silent         = options[:silent] || false
         | 
| 302 | 
            +
                @log_loud           = options[:loud] || false
         | 
| 281 303 | 
             
                @throttle_seconds   = options[:throttle_seconds] || 1
         | 
| 282 304 | 
             
                @password           = options[:server_password]
         | 
| 283 305 |  | 
| 306 | 
            +
                # Special handling to avoid mucking with Logger constants if we're using a different logger
         | 
| 307 | 
            +
                if options[:log]
         | 
| 308 | 
            +
                  @log = options[:log]
         | 
| 309 | 
            +
                else
         | 
| 310 | 
            +
                  @log = Logger.new(options[:log_io] || STDERR)
         | 
| 311 | 
            +
                  @log.level = Logger::WARN
         | 
| 312 | 
            +
             
         | 
| 313 | 
            +
                  # Convert old-school options into logger stuff
         | 
| 314 | 
            +
                  @log.level = Logger::DEBUG if @log_loud
         | 
| 315 | 
            +
                  @log.level = Logger::FATAL if @log_silent
         | 
| 316 | 
            +
                end
         | 
| 317 | 
            +
             | 
| 318 | 
            +
                if (options[:silent] || options[:loud])
         | 
| 319 | 
            +
                  @log.warn '[DEPRECATED] - passing :silent and :loud options to constructor are deprecated as of 1.4.1'
         | 
| 320 | 
            +
                end
         | 
| 321 | 
            +
             | 
| 284 322 | 
             
                # Read in map of event numbers and names.  Yes, I stole this event map
         | 
| 285 323 | 
             
                # file from RubyIRC and made very minor changes....  They stole it from
         | 
| 286 324 | 
             
                # somewhere else anyway, so it's okay.
         | 
| @@ -294,7 +332,7 @@ class YAIL | |
| 294 332 | 
             
                begin
         | 
| 295 333 | 
             
                  @socket = TCPSocket.new(@address, @port)
         | 
| 296 334 | 
             
                rescue StandardError => boom
         | 
| 297 | 
            -
                   | 
| 335 | 
            +
                  @log.fatal "+++ERROR: Unable to open socket connection in Net::YAIL.initialize: #{boom.inspect}"
         | 
| 298 336 | 
             
                  @dead_socket = true
         | 
| 299 337 | 
             
                  raise
         | 
| 300 338 | 
             
                end
         | 
| @@ -387,7 +425,7 @@ class YAIL | |
| 387 425 | 
             
                  line = @socket.gets
         | 
| 388 426 | 
             
                rescue StandardError => boom
         | 
| 389 427 | 
             
                  @dead_socket = true
         | 
| 390 | 
            -
                   | 
| 428 | 
            +
                  @log.fatal "+++ERROR in read_incoming_data -> @socket.gets: #{boom.inspect}"
         | 
| 391 429 | 
             
                  raise
         | 
| 392 430 | 
             
                end
         | 
| 393 431 |  | 
| @@ -399,7 +437,7 @@ class YAIL | |
| 399 437 |  | 
| 400 438 | 
             
                line.chomp!
         | 
| 401 439 |  | 
| 402 | 
            -
                 | 
| 440 | 
            +
                @log.debug "+++INCOMING: #{line}"
         | 
| 403 441 |  | 
| 404 442 | 
             
                # Only synchronize long enough to push our incoming string onto the
         | 
| 405 443 | 
             
                # input buffer
         | 
| @@ -562,10 +600,13 @@ class YAIL | |
| 562 600 | 
             
                  when :incoming_nick
         | 
| 563 601 | 
             
                    handle(event.type, event.fullname, event.nick, event.text)
         | 
| 564 602 |  | 
| 603 | 
            +
                  when :incoming_error
         | 
| 604 | 
            +
                    handle(event.type, event.text)
         | 
| 605 | 
            +
             | 
| 565 606 | 
             
                  # Unknown line!
         | 
| 566 607 | 
             
                  else
         | 
| 567 | 
            -
                    # This should really never happen,  | 
| 568 | 
            -
                     | 
| 608 | 
            +
                    # This should really never happen, but isn't technically an error per se
         | 
| 609 | 
            +
                    @log.warn 'Unknown line: %s!' % line.inspect
         | 
| 569 610 | 
             
                    handle(:incoming_miscellany, line)
         | 
| 570 611 | 
             
                end
         | 
| 571 612 | 
             
              end
         | 
| @@ -608,7 +649,7 @@ class YAIL | |
| 608 649 | 
             
                # Don't bother with anything if there are no handlers registered.
         | 
| 609 650 | 
             
                return unless Array === @handlers[event]
         | 
| 610 651 |  | 
| 611 | 
            -
                 | 
| 652 | 
            +
                @log.debug "+++EVENT HANDLER: Handling event #{event} via #{@handlers[event].inspect}:"
         | 
| 612 653 |  | 
| 613 654 | 
             
                # Call all hooks in order until one breaks the chain.  For incoming
         | 
| 614 655 | 
             
                # events, we want something to break the chain or else it'll likely
         | 
| @@ -633,7 +674,7 @@ class YAIL | |
| 633 674 | 
             
                  handle(base_event, text, args)
         | 
| 634 675 | 
             
                else
         | 
| 635 676 | 
             
                  # No handler = report and don't worry about it
         | 
| 636 | 
            -
                   | 
| 677 | 
            +
                  @log.info "Unknown raw #{number.to_s} from #{fullactor}: #{text}"
         | 
| 637 678 | 
             
                end
         | 
| 638 679 | 
             
              end
         | 
| 639 680 |  | 
    
        data/lib/net/yail/IRCBot.rb
    CHANGED
    
    | @@ -1,154 +1,7 @@ | |
| 1 | 
            +
            # This is a deprecated file!
         | 
| 2 | 
            +
            warn '[DEPRECATED] Requiring "net/yail/IRCBot" is deprecated!  Use "net/yail/irc_bot" instead.'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            # Wrapper for irc_bot for backward-compatibility
         | 
| 1 5 | 
             
            require 'rubygems'
         | 
| 2 6 | 
             
            require 'net/yail'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            # My abstraction from adapter to a real bot.
         | 
| 5 | 
            -
            class IRCBot
         | 
| 6 | 
            -
              attr_reader :irc
         | 
| 7 | 
            -
             | 
| 8 | 
            -
              public
         | 
| 9 | 
            -
             | 
| 10 | 
            -
              # Creates a new bot yay.  Note that due to my laziness, the options here
         | 
| 11 | 
            -
              # are almost exactly the same as those in Net::YAIL.  But at least there
         | 
| 12 | 
            -
              # are more defaults here.
         | 
| 13 | 
            -
              #
         | 
| 14 | 
            -
              # Options:
         | 
| 15 | 
            -
              # * <tt>:irc_network</tt>: Name/IP of the IRC server
         | 
| 16 | 
            -
              # * <tt>:channels</tt>: Channels to automatically join on connect
         | 
| 17 | 
            -
              # * <tt>:port</tt>: Port number, defaults to 6667
         | 
| 18 | 
            -
              # * <tt>:username</tt>: Username reported to server
         | 
| 19 | 
            -
              # * <tt>:realname</tt>: Real name reported to server
         | 
| 20 | 
            -
              # * <tt>:nicknames</tt>: Array of nicknames to cycle through
         | 
| 21 | 
            -
              # * <tt>:silent</tt>: Silence a lot of reports
         | 
| 22 | 
            -
              # * <tt>:loud</tt>: Lots more verbose reports
         | 
| 23 | 
            -
              def initialize(options = {})
         | 
| 24 | 
            -
                @start_time = Time.now
         | 
| 25 | 
            -
             | 
| 26 | 
            -
                @channels = options[:channels] || []
         | 
| 27 | 
            -
                @irc_network = options[:irc_network]
         | 
| 28 | 
            -
                @port = options[:port] || 6667
         | 
| 29 | 
            -
                @username = options[:username] || 'IRCBot'
         | 
| 30 | 
            -
                @realname = options[:realname] || 'IRCBot'
         | 
| 31 | 
            -
                @nicknames = options[:nicknames] || ['IRCBot1', 'IRCBot2', 'IRCBot3']
         | 
| 32 | 
            -
                @silent = options[:silent] || false
         | 
| 33 | 
            -
                @loud = options[:loud] || false
         | 
| 34 | 
            -
              end
         | 
| 35 | 
            -
             | 
| 36 | 
            -
              # Returns a string representing uptime
         | 
| 37 | 
            -
              def get_uptime_string
         | 
| 38 | 
            -
                uptime = (Time.now - @start_time).to_i
         | 
| 39 | 
            -
                seconds = uptime % 60
         | 
| 40 | 
            -
                minutes = (uptime / 60) % 60
         | 
| 41 | 
            -
                hours = (uptime / 3600) % 24
         | 
| 42 | 
            -
                days = (uptime / 86400)
         | 
| 43 | 
            -
             | 
| 44 | 
            -
                str = []
         | 
| 45 | 
            -
                str.push("#{days} day(s)") if days > 0
         | 
| 46 | 
            -
                str.push("#{hours} hour(s)") if hours > 0
         | 
| 47 | 
            -
                str.push("#{minutes} minute(s)") if minutes > 0
         | 
| 48 | 
            -
                str.push("#{seconds} second(s)") if seconds > 0
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                return str.join(', ')
         | 
| 51 | 
            -
              end
         | 
| 52 | 
            -
             | 
| 53 | 
            -
              # Creates the socket connection and registers the (very simple) default
         | 
| 54 | 
            -
              # welcome handler.  Subclasses should build their hooks in
         | 
| 55 | 
            -
              # add_custom_handlers to allow auto-creation in case of a restart.
         | 
| 56 | 
            -
              def connect_socket
         | 
| 57 | 
            -
                @irc = Net::YAIL.new(
         | 
| 58 | 
            -
                  :address    => @irc_network,
         | 
| 59 | 
            -
                  :port       => @port,
         | 
| 60 | 
            -
                  :username   => @username,
         | 
| 61 | 
            -
                  :realname   => @realname,
         | 
| 62 | 
            -
                  :nicknames  => @nicknames,
         | 
| 63 | 
            -
                  :silent     => @silent,
         | 
| 64 | 
            -
                  :loud       => @loud
         | 
| 65 | 
            -
                )
         | 
| 66 | 
            -
             | 
| 67 | 
            -
                # Simple hook for welcome to allow auto-joining of the channel
         | 
| 68 | 
            -
                @irc.prepend_handler :incoming_welcome, self.method(:welcome)
         | 
| 69 | 
            -
             | 
| 70 | 
            -
                add_custom_handlers
         | 
| 71 | 
            -
              end
         | 
| 72 | 
            -
             | 
| 73 | 
            -
              # To be subclassed - this method is a nice central location to allow the
         | 
| 74 | 
            -
              # bot to register its handlers before this class takes control and hits
         | 
| 75 | 
            -
              # the IRC network.
         | 
| 76 | 
            -
              def add_custom_handlers
         | 
| 77 | 
            -
                raise "You must define your handlers in add_custom_handlers, or else " +
         | 
| 78 | 
            -
                    "explicitly override with an empty method."
         | 
| 79 | 
            -
              end
         | 
| 80 | 
            -
             | 
| 81 | 
            -
              # Enters the socket's listening loop(s)
         | 
| 82 | 
            -
              def start_listening
         | 
| 83 | 
            -
                # If socket's already dead (probably couldn't connect to server), don't
         | 
| 84 | 
            -
                # try to listen!
         | 
| 85 | 
            -
                if @irc.dead_socket
         | 
| 86 | 
            -
                  $stderr.puts "Dead socket, can't start listening!"
         | 
| 87 | 
            -
                end
         | 
| 88 | 
            -
             | 
| 89 | 
            -
                @irc.start_listening
         | 
| 90 | 
            -
              end
         | 
| 91 | 
            -
             | 
| 92 | 
            -
              # Tells us the main app wants to just wait until we're done with all
         | 
| 93 | 
            -
              # thread processing, or get a kill signal, or whatever.  For now this is
         | 
| 94 | 
            -
              # basically an endless loop that lets the threads do their thing until
         | 
| 95 | 
            -
              # the socket dies.  If a bot wants, it can handle :irc_loop to do regular
         | 
| 96 | 
            -
              # processing.
         | 
| 97 | 
            -
              def irc_loop
         | 
| 98 | 
            -
                while true
         | 
| 99 | 
            -
                  until @irc.dead_socket
         | 
| 100 | 
            -
                    sleep 15
         | 
| 101 | 
            -
                    @irc.handle(:irc_loop)
         | 
| 102 | 
            -
                    Thread.pass
         | 
| 103 | 
            -
                  end
         | 
| 104 | 
            -
             | 
| 105 | 
            -
                  # Disconnected?  Wait a little while and start up again.
         | 
| 106 | 
            -
                  sleep 30
         | 
| 107 | 
            -
                  @irc.stop_listening
         | 
| 108 | 
            -
                  self.connect_socket
         | 
| 109 | 
            -
                  start_listening
         | 
| 110 | 
            -
                end
         | 
| 111 | 
            -
              end
         | 
| 112 | 
            -
             | 
| 113 | 
            -
              private
         | 
| 114 | 
            -
              # Basic handler for joining our channels upon successful registration
         | 
| 115 | 
            -
              def welcome(text, args)
         | 
| 116 | 
            -
                @channels.each {|channel| @irc.join(channel) }
         | 
| 117 | 
            -
                # Let the default welcome stuff still happen
         | 
| 118 | 
            -
                return false
         | 
| 119 | 
            -
              end
         | 
| 120 | 
            -
             | 
| 121 | 
            -
              ################
         | 
| 122 | 
            -
              # Helpful wrappers
         | 
| 123 | 
            -
              ################
         | 
| 124 | 
            -
             | 
| 125 | 
            -
              # Wraps Net::YAIL.me
         | 
| 126 | 
            -
              def bot_name
         | 
| 127 | 
            -
                @irc.me
         | 
| 128 | 
            -
              end
         | 
| 129 | 
            -
             | 
| 130 | 
            -
              # Wraps Net::YAIL.msg
         | 
| 131 | 
            -
              def msg(*args)
         | 
| 132 | 
            -
                @irc.msg(*args)
         | 
| 133 | 
            -
              end
         | 
| 134 | 
            -
             | 
| 135 | 
            -
              # Wraps Net::YAIL.act
         | 
| 136 | 
            -
              def act(*args)
         | 
| 137 | 
            -
                @irc.act(*args)
         | 
| 138 | 
            -
              end
         | 
| 139 | 
            -
             | 
| 140 | 
            -
              # Wraps Net::YAIL.join
         | 
| 141 | 
            -
              def join(*args)
         | 
| 142 | 
            -
                @irc.join(*args)
         | 
| 143 | 
            -
              end
         | 
| 144 | 
            -
             | 
| 145 | 
            -
              # Wraps Net::YAIL.report
         | 
| 146 | 
            -
              def report(*args)
         | 
| 147 | 
            -
                @irc.report(*args)
         | 
| 148 | 
            -
              end
         | 
| 149 | 
            -
             | 
| 150 | 
            -
              # Wraps Net::YAIL.nick
         | 
| 151 | 
            -
              def nick(*args)
         | 
| 152 | 
            -
                @irc.nick(*args)
         | 
| 153 | 
            -
              end
         | 
| 154 | 
            -
            end
         | 
| 7 | 
            +
            require 'net/yail/irc_bot'
         | 
| @@ -0,0 +1,155 @@ | |
| 1 | 
            +
            require 'rubygems'
         | 
| 2 | 
            +
            require 'net/yail'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            # My abstraction from adapter to a real bot.
         | 
| 5 | 
            +
            class IRCBot
         | 
| 6 | 
            +
              attr_reader :irc
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              public
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              # Creates a new bot.  Options are anything you can pass to the Net::YAIL constructor:
         | 
| 11 | 
            +
              # * <tt>:irc_network</tt>: Name/IP of the IRC server - backward-compatibility hack, and is
         | 
| 12 | 
            +
              #   ignored if :address is passed in
         | 
| 13 | 
            +
              # * <tt>:address</tt>: Name/IP of the IRC server
         | 
| 14 | 
            +
              # * <tt>:port</tt>: Port number, defaults to 6667
         | 
| 15 | 
            +
              # * <tt>:username</tt>: Username reported to server
         | 
| 16 | 
            +
              # * <tt>:realname</tt>: Real name reported to server
         | 
| 17 | 
            +
              # * <tt>:nicknames</tt>: Array of nicknames to cycle through
         | 
| 18 | 
            +
              # * <tt>:throttle_seconds</tt>: Seconds between a cycle of privmsg sends.
         | 
| 19 | 
            +
              #   Defaults to 1.  One "cycle" is defined as sending one line of output to
         | 
| 20 | 
            +
              #   *all* targets that have output buffered.
         | 
| 21 | 
            +
              # * <tt>:server_password</tt>: Very optional.  If set, this is the password
         | 
| 22 | 
            +
              #   sent out to the server before USER and NICK messages.
         | 
| 23 | 
            +
              # * <tt>:log</tt>: Optional, if set uses this logger instead of the default (Ruby's Logger).
         | 
| 24 | 
            +
              #   If set, :loud and :silent options are ignored.
         | 
| 25 | 
            +
              # * <tt>:log_io</tt>: Optional, ignored if you specify your own :log - sends given object to
         | 
| 26 | 
            +
              #   Logger's constructor.  Must be filename or IO object.
         | 
| 27 | 
            +
              def initialize(options = {})
         | 
| 28 | 
            +
                @start_time = Time.now
         | 
| 29 | 
            +
                @options = options
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                # Set up some friendly defaults
         | 
| 32 | 
            +
                @options[:address]    ||= @options.delete(:irc_network)
         | 
| 33 | 
            +
                @options[:channels]   ||= []
         | 
| 34 | 
            +
                @options[:port]       ||= 6667
         | 
| 35 | 
            +
                @options[:username]   ||= 'IRCBot'
         | 
| 36 | 
            +
                @options[:realname]   ||= 'IRCBot'
         | 
| 37 | 
            +
                @options[:nicknames]  ||= ['IRCBot1', 'IRCBot2', 'IRCBot3']
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              # Returns a string representing uptime
         | 
| 41 | 
            +
              def get_uptime_string
         | 
| 42 | 
            +
                uptime = (Time.now - @start_time).to_i
         | 
| 43 | 
            +
                seconds = uptime % 60
         | 
| 44 | 
            +
                minutes = (uptime / 60) % 60
         | 
| 45 | 
            +
                hours = (uptime / 3600) % 24
         | 
| 46 | 
            +
                days = (uptime / 86400)
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                str = []
         | 
| 49 | 
            +
                str.push("#{days} day(s)") if days > 0
         | 
| 50 | 
            +
                str.push("#{hours} hour(s)") if hours > 0
         | 
| 51 | 
            +
                str.push("#{minutes} minute(s)") if minutes > 0
         | 
| 52 | 
            +
                str.push("#{seconds} second(s)") if seconds > 0
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                return str.join(', ')
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              # Creates the socket connection and registers the (very simple) default
         | 
| 58 | 
            +
              # welcome handler.  Subclasses should build their hooks in
         | 
| 59 | 
            +
              # add_custom_handlers to allow auto-creation in case of a restart.
         | 
| 60 | 
            +
              def connect_socket
         | 
| 61 | 
            +
                @irc = Net::YAIL.new(@options)
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                # Simple hook for welcome to allow auto-joining of the channel
         | 
| 64 | 
            +
                @irc.prepend_handler :incoming_welcome, self.method(:welcome)
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                add_custom_handlers
         | 
| 67 | 
            +
              end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
              # To be subclassed - this method is a nice central location to allow the
         | 
| 70 | 
            +
              # bot to register its handlers before this class takes control and hits
         | 
| 71 | 
            +
              # the IRC network.
         | 
| 72 | 
            +
              def add_custom_handlers
         | 
| 73 | 
            +
                raise "You must define your handlers in add_custom_handlers, or else " +
         | 
| 74 | 
            +
                    "explicitly override with an empty method."
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              # Enters the socket's listening loop(s)
         | 
| 78 | 
            +
              def start_listening
         | 
| 79 | 
            +
                # If socket's already dead (probably couldn't connect to server), don't
         | 
| 80 | 
            +
                # try to listen!
         | 
| 81 | 
            +
                if @irc.dead_socket
         | 
| 82 | 
            +
                  $stderr.puts "Dead socket, can't start listening!"
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                @irc.start_listening
         | 
| 86 | 
            +
              end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
              # Tells us the main app wants to just wait until we're done with all
         | 
| 89 | 
            +
              # thread processing, or get a kill signal, or whatever.  For now this is
         | 
| 90 | 
            +
              # basically an endless loop that lets the threads do their thing until
         | 
| 91 | 
            +
              # the socket dies.  If a bot wants, it can handle :irc_loop to do regular
         | 
| 92 | 
            +
              # processing.
         | 
| 93 | 
            +
              def irc_loop
         | 
| 94 | 
            +
                while true
         | 
| 95 | 
            +
                  until @irc.dead_socket
         | 
| 96 | 
            +
                    sleep 15
         | 
| 97 | 
            +
                    @irc.handle(:irc_loop)
         | 
| 98 | 
            +
                    Thread.pass
         | 
| 99 | 
            +
                  end
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                  # Disconnected?  Wait a little while and start up again.
         | 
| 102 | 
            +
                  sleep 30
         | 
| 103 | 
            +
                  @irc.stop_listening
         | 
| 104 | 
            +
                  self.connect_socket
         | 
| 105 | 
            +
                  start_listening
         | 
| 106 | 
            +
                end
         | 
| 107 | 
            +
              end
         | 
| 108 | 
            +
             | 
| 109 | 
            +
              private
         | 
| 110 | 
            +
              # Basic handler for joining our channels upon successful registration
         | 
| 111 | 
            +
              def welcome(text, args)
         | 
| 112 | 
            +
                @options[:channels].each {|channel| @irc.join(channel) }
         | 
| 113 | 
            +
                # Let the default welcome stuff still happen
         | 
| 114 | 
            +
                return false
         | 
| 115 | 
            +
              end
         | 
| 116 | 
            +
             | 
| 117 | 
            +
              ################
         | 
| 118 | 
            +
              # Helpful wrappers
         | 
| 119 | 
            +
              ################
         | 
| 120 | 
            +
             | 
| 121 | 
            +
              # Wraps Net::YAIL.log
         | 
| 122 | 
            +
              def log
         | 
| 123 | 
            +
                @irc.log
         | 
| 124 | 
            +
              end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
              # Wraps Net::YAIL.me
         | 
| 127 | 
            +
              def bot_name
         | 
| 128 | 
            +
                @irc.me
         | 
| 129 | 
            +
              end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
              # Wraps Net::YAIL.msg
         | 
| 132 | 
            +
              def msg(*args)
         | 
| 133 | 
            +
                @irc.msg(*args)
         | 
| 134 | 
            +
              end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
              # Wraps Net::YAIL.act
         | 
| 137 | 
            +
              def act(*args)
         | 
| 138 | 
            +
                @irc.act(*args)
         | 
| 139 | 
            +
              end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
              # Wraps Net::YAIL.join
         | 
| 142 | 
            +
              def join(*args)
         | 
| 143 | 
            +
                @irc.join(*args)
         | 
| 144 | 
            +
              end
         | 
| 145 | 
            +
             | 
| 146 | 
            +
              # Wraps Net::YAIL.report
         | 
| 147 | 
            +
              def report(*args)
         | 
| 148 | 
            +
                @irc.report(*args)
         | 
| 149 | 
            +
              end
         | 
| 150 | 
            +
             | 
| 151 | 
            +
              # Wraps Net::YAIL.nick
         | 
| 152 | 
            +
              def nick(*args)
         | 
| 153 | 
            +
                @irc.nick(*args)
         | 
| 154 | 
            +
              end
         | 
| 155 | 
            +
            end
         | 
    
        data/lib/net/yail/output_api.rb
    CHANGED
    
    | @@ -69,7 +69,7 @@ module IRCOutputAPI | |
| 69 69 |  | 
| 70 70 | 
             
                handle(:outgoing_msg, target, text)
         | 
| 71 71 |  | 
| 72 | 
            -
                report_string = @ | 
| 72 | 
            +
                report_string = @log_silent ? '' : "{#{target}} <#{@me}> #{text}"
         | 
| 73 73 | 
             
                privmsg(target, text, report_string)
         | 
| 74 74 | 
             
              end
         | 
| 75 75 |  | 
| @@ -81,7 +81,7 @@ module IRCOutputAPI | |
| 81 81 |  | 
| 82 82 | 
             
                handle(:outgoing_ctcp, target, text)
         | 
| 83 83 |  | 
| 84 | 
            -
                report_string = @ | 
| 84 | 
            +
                report_string = @log_silent ? '' :  "{#{target}}  [#{@me} #{text}]"
         | 
| 85 85 | 
             
                privmsg(target, "\001#{text}\001", report_string)
         | 
| 86 86 | 
             
              end
         | 
| 87 87 |  | 
| @@ -105,7 +105,7 @@ module IRCOutputAPI | |
| 105 105 |  | 
| 106 106 | 
             
                handle(:outgoing_notice, target, text)
         | 
| 107 107 |  | 
| 108 | 
            -
                report "{#{target}} -#{@me}- #{text}" unless @ | 
| 108 | 
            +
                report "{#{target}} -#{@me}- #{text}" unless @log_silent
         | 
| 109 109 | 
             
                raw("NOTICE #{target} :#{text}", false)
         | 
| 110 110 | 
             
              end
         | 
| 111 111 |  | 
| @@ -118,7 +118,7 @@ module IRCOutputAPI | |
| 118 118 |  | 
| 119 119 | 
             
                handle(:outgoing_ctcpreply, target, text)
         | 
| 120 120 |  | 
| 121 | 
            -
                report "{#{target}} [Reply: #{@me} #{text}]" unless @ | 
| 121 | 
            +
                report "{#{target}} [Reply: #{@me} #{text}]" unless @log_silent
         | 
| 122 122 | 
             
                notice(target, "\001#{text}\001")
         | 
| 123 123 | 
             
              end
         | 
| 124 124 |  | 
    
        data/tests/tc_event.rb
    CHANGED
    
    | @@ -224,4 +224,11 @@ class MessageParserEventTest < Test::Unit::TestCase | |
| 224 224 | 
             
                assert_equal ['foo'], event.targets
         | 
| 225 225 | 
             
                assert_equal '+k', event.text
         | 
| 226 226 | 
             
              end
         | 
| 227 | 
            +
             | 
| 228 | 
            +
              # Simple test of error event
         | 
| 229 | 
            +
              def test_error
         | 
| 230 | 
            +
                event = Net::YAIL::IncomingEvent.parse 'ERROR :Closing Link: nerdbucket.com (Quit: Terminated by user)'
         | 
| 231 | 
            +
                assert_equal :incoming_error, event.type
         | 
| 232 | 
            +
                assert_equal 'Closing Link: nerdbucket.com (Quit: Terminated by user)', event.text
         | 
| 233 | 
            +
              end
         | 
| 227 234 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version | |
| 5 5 | 
             
              segments: 
         | 
| 6 6 | 
             
              - 1
         | 
| 7 7 | 
             
              - 4
         | 
| 8 | 
            -
              -  | 
| 9 | 
            -
              version: 1.4. | 
| 8 | 
            +
              - 2
         | 
| 9 | 
            +
              version: 1.4.2
         | 
| 10 10 | 
             
            platform: ruby
         | 
| 11 11 | 
             
            authors: 
         | 
| 12 12 | 
             
            - Jeremy Echols
         | 
| @@ -14,7 +14,7 @@ autorequire: net/yail | |
| 14 14 | 
             
            bindir: bin
         | 
| 15 15 | 
             
            cert_chain: []
         | 
| 16 16 |  | 
| 17 | 
            -
            date: 2010-09- | 
| 17 | 
            +
            date: 2010-09-08 00:00:00 -04:00
         | 
| 18 18 | 
             
            default_executable: 
         | 
| 19 19 | 
             
            dependencies: []
         | 
| 20 20 |  | 
| @@ -40,6 +40,7 @@ files: | |
| 40 40 | 
             
            - lib/net/yail/output_api.rb
         | 
| 41 41 | 
             
            - lib/net/yail/event.rb
         | 
| 42 42 | 
             
            - lib/net/yail/yail-version.rb
         | 
| 43 | 
            +
            - lib/net/yail/irc_bot.rb
         | 
| 43 44 | 
             
            - tests/net_yail.rb
         | 
| 44 45 | 
             
            - tests/tc_message_parser.rb
         | 
| 45 46 | 
             
            - tests/tc_event.rb
         |