Ruby-IRC 1.0.7 → 1.0.10
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/lib/IRC.rb +26 -6
 - data/lib/IRC.rb.~1.8.~ +153 -0
 - data/lib/IRCConnection.rb +38 -15
 - data/lib/IRCConnection.rb.~1.4.~ +97 -0
 - data/lib/IRCEvent.rb +2 -1
 - metadata +6 -3
 
    
        data/lib/IRC.rb
    CHANGED
    
    | 
         @@ -66,13 +66,17 @@ class IRC 
     | 
|
| 
       66 
66 
     | 
    
         | 
| 
       67 
67 
     | 
    
         
             
                IRCConnection.handle_connection(@server, @port, @nick, @realname) do
         
     | 
| 
       68 
68 
     | 
    
         
             
                  # Log in information moved to IRCConnection
         
     | 
| 
       69 
     | 
    
         
            -
                  threads = []
         
     | 
| 
      
 69 
     | 
    
         
            +
                  @threads = []
         
     | 
| 
       70 
70 
     | 
    
         
             
                  IRCConnection.main do |event|
         
     | 
| 
       71 
     | 
    
         
            -
                     
     | 
| 
       72 
     | 
    
         
            -
                       
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
      
 71 
     | 
    
         
            +
                    if event.kind_of?(Array)
         
     | 
| 
      
 72 
     | 
    
         
            +
                      event.each {|event|
         
     | 
| 
      
 73 
     | 
    
         
            +
                        thread_event(event)
         
     | 
| 
      
 74 
     | 
    
         
            +
                      }
         
     | 
| 
      
 75 
     | 
    
         
            +
                    else
         
     | 
| 
      
 76 
     | 
    
         
            +
                      thread_event(event)
         
     | 
| 
      
 77 
     | 
    
         
            +
                    end
         
     | 
| 
       74 
78 
     | 
    
         
             
                  end
         
     | 
| 
       75 
     | 
    
         
            -
                  threads.each {|thr| thr.join }
         
     | 
| 
      
 79 
     | 
    
         
            +
                  @threads.each {|thr| thr.join }
         
     | 
| 
       76 
80 
     | 
    
         
             
                end
         
     | 
| 
       77 
81 
     | 
    
         
             
              end
         
     | 
| 
       78 
82 
     | 
    
         | 
| 
         @@ -89,7 +93,17 @@ class IRC 
     | 
|
| 
       89 
93 
     | 
    
         
             
                  @channels.delete_if {|chan| chan.name == channel }
         
     | 
| 
       90 
94 
     | 
    
         
             
                end
         
     | 
| 
       91 
95 
     | 
    
         
             
              end
         
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
              # kicks a user from a channel (does not check for operator privledge)
         
     | 
| 
      
 98 
     | 
    
         
            +
              def kick(channel, user, message)
         
     | 
| 
      
 99 
     | 
    
         
            +
                IRCConnection.send_to_server("KICK #{channel} #{user} :#{message || user || 'kicked'}")
         
     | 
| 
      
 100 
     | 
    
         
            +
              end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
              # sets the topic of the given channel
         
     | 
| 
      
 103 
     | 
    
         
            +
              def set_topic(channel, topic)
         
     | 
| 
      
 104 
     | 
    
         
            +
                IRCConnection.send_to_server("TOPIC #{channel} :#{topic}");
         
     | 
| 
      
 105 
     | 
    
         
            +
              end
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
       93 
107 
     | 
    
         
             
              # Sends a private message, or channel message
         
     | 
| 
       94 
108 
     | 
    
         
             
              def send_message(to, message)
         
     | 
| 
       95 
109 
     | 
    
         
             
                IRCConnection.send_to_server("privmsg #{to} :#{message}");
         
     | 
| 
         @@ -140,4 +154,10 @@ class IRC 
     | 
|
| 
       140 
154 
     | 
    
         
             
              def get_user_info(user)
         
     | 
| 
       141 
155 
     | 
    
         
             
                IRCConnection.send_to_server("WHO #{user}")
         
     | 
| 
       142 
156 
     | 
    
         
             
              end
         
     | 
| 
      
 157 
     | 
    
         
            +
              private
         
     | 
| 
      
 158 
     | 
    
         
            +
              def thread_event (event)
         
     | 
| 
      
 159 
     | 
    
         
            +
                @threads << Thread.new(event) {|localevent|
         
     | 
| 
      
 160 
     | 
    
         
            +
                  localevent.process
         
     | 
| 
      
 161 
     | 
    
         
            +
                }
         
     | 
| 
      
 162 
     | 
    
         
            +
              end
         
     | 
| 
       143 
163 
     | 
    
         
             
            end
         
     | 
    
        data/lib/IRC.rb.~1.8.~
    ADDED
    
    | 
         @@ -0,0 +1,153 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
             
     | 
| 
      
 2 
     | 
    
         
            +
            require 'socket'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'IRCConnection'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'IRCEvent'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'IRCChannel'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'IRCUser'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'IRCUtil'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            # Class IRC is a master class that handles connection to the irc
         
     | 
| 
      
 12 
     | 
    
         
            +
            # server and pasring of IRC events, through the IRCEvent class. 
         
     | 
| 
      
 13 
     | 
    
         
            +
            class IRC
         
     | 
| 
      
 14 
     | 
    
         
            +
              @channels = nil
         
     | 
| 
      
 15 
     | 
    
         
            +
              # Create a new IRC Object instance
         
     | 
| 
      
 16 
     | 
    
         
            +
              def initialize( nick, server, port, realname='RBot')
         
     | 
| 
      
 17 
     | 
    
         
            +
                @nick = nick
         
     | 
| 
      
 18 
     | 
    
         
            +
                @server = server
         
     | 
| 
      
 19 
     | 
    
         
            +
                @port = port
         
     | 
| 
      
 20 
     | 
    
         
            +
                @realname = realname
         
     | 
| 
      
 21 
     | 
    
         
            +
                @channels = Array.new(0)
         
     | 
| 
      
 22 
     | 
    
         
            +
                # Some good default Event handlers. These can and will be overridden by users.
         
     | 
| 
      
 23 
     | 
    
         
            +
                # Thses make changes on the IRCbot object. So they need to be here.
         
     | 
| 
      
 24 
     | 
    
         
            +
                
         
     | 
| 
      
 25 
     | 
    
         
            +
                # Topic events can come on two tags, so we create on proc to handle them.
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                topic_proc = Proc.new { |event|
         
     | 
| 
      
 28 
     | 
    
         
            +
                  self.channels.each { |chan| 
         
     | 
| 
      
 29 
     | 
    
         
            +
                    if chan == event.channel
         
     | 
| 
      
 30 
     | 
    
         
            +
                      chan.topic = event.message
         
     | 
| 
      
 31 
     | 
    
         
            +
                    end
         
     | 
| 
      
 32 
     | 
    
         
            +
                  }
         
     | 
| 
      
 33 
     | 
    
         
            +
                }
         
     | 
| 
      
 34 
     | 
    
         
            +
                
         
     | 
| 
      
 35 
     | 
    
         
            +
                IRCEvent.add_handler('332', topic_proc)
         
     | 
| 
      
 36 
     | 
    
         
            +
                IRCEvent.add_handler('topic', topic_proc)
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
              
         
     | 
| 
      
 41 
     | 
    
         
            +
              attr_reader :nick, :server, :port
         
     | 
| 
      
 42 
     | 
    
         
            +
              
         
     | 
| 
      
 43 
     | 
    
         
            +
              # Join a channel, adding it to the list of joined channels
         
     | 
| 
      
 44 
     | 
    
         
            +
              def add_channel channel
         
     | 
| 
      
 45 
     | 
    
         
            +
                join(channel)
         
     | 
| 
      
 46 
     | 
    
         
            +
                self
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
              
         
     | 
| 
      
 49 
     | 
    
         
            +
              # Returns a list of channels joined
         
     | 
| 
      
 50 
     | 
    
         
            +
              def channels
         
     | 
| 
      
 51 
     | 
    
         
            +
                @channels
         
     | 
| 
      
 52 
     | 
    
         
            +
              end
         
     | 
| 
      
 53 
     | 
    
         
            +
              
         
     | 
| 
      
 54 
     | 
    
         
            +
              # Alias for IRC.connect
         
     | 
| 
      
 55 
     | 
    
         
            +
              def start
         
     | 
| 
      
 56 
     | 
    
         
            +
                self.connect
         
     | 
| 
      
 57 
     | 
    
         
            +
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
              
         
     | 
| 
      
 59 
     | 
    
         
            +
              # Open a connection to the server using the IRC Connect
         
     | 
| 
      
 60 
     | 
    
         
            +
              # method. Events yielded from the IRCConnection handler are
         
     | 
| 
      
 61 
     | 
    
         
            +
              # processed and then control is returned to IRCConnection
         
     | 
| 
      
 62 
     | 
    
         
            +
              def connect
         
     | 
| 
      
 63 
     | 
    
         
            +
                quithandler = lambda { send_quit(); IRCConnection.quit }
         
     | 
| 
      
 64 
     | 
    
         
            +
                trap("INT", quithandler) 
         
     | 
| 
      
 65 
     | 
    
         
            +
                trap("TERM", quithandler)
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                IRCConnection.handle_connection(@server, @port, @nick, @realname) do
         
     | 
| 
      
 68 
     | 
    
         
            +
                  # Log in information moved to IRCConnection
         
     | 
| 
      
 69 
     | 
    
         
            +
                  threads = []
         
     | 
| 
      
 70 
     | 
    
         
            +
                  IRCConnection.main do |event|
         
     | 
| 
      
 71 
     | 
    
         
            +
                    threads << Thread.new(event) {|localevent|
         
     | 
| 
      
 72 
     | 
    
         
            +
                      localevent.process
         
     | 
| 
      
 73 
     | 
    
         
            +
                    }
         
     | 
| 
      
 74 
     | 
    
         
            +
                  end
         
     | 
| 
      
 75 
     | 
    
         
            +
                  threads.each {|thr| thr.join }
         
     | 
| 
      
 76 
     | 
    
         
            +
                end
         
     | 
| 
      
 77 
     | 
    
         
            +
              end
         
     | 
| 
      
 78 
     | 
    
         
            +
              
         
     | 
| 
      
 79 
     | 
    
         
            +
              # Joins a channel on a server.
         
     | 
| 
      
 80 
     | 
    
         
            +
              def join(channel)
         
     | 
| 
      
 81 
     | 
    
         
            +
                if (IRCConnection.send_to_server("JOIN #{channel}"))
         
     | 
| 
      
 82 
     | 
    
         
            +
                  @channels.push(IRCChannel.new(channel));
         
     | 
| 
      
 83 
     | 
    
         
            +
                end
         
     | 
| 
      
 84 
     | 
    
         
            +
              end
         
     | 
| 
      
 85 
     | 
    
         
            +
              
         
     | 
| 
      
 86 
     | 
    
         
            +
              # Leaves a channel on a server
         
     | 
| 
      
 87 
     | 
    
         
            +
              def part(channel)
         
     | 
| 
      
 88 
     | 
    
         
            +
                if (IRCConnection.send_to_server("PART #{channel}")) 
         
     | 
| 
      
 89 
     | 
    
         
            +
                  @channels.delete_if {|chan| chan.name == channel }
         
     | 
| 
      
 90 
     | 
    
         
            +
                end
         
     | 
| 
      
 91 
     | 
    
         
            +
              end
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
              # kicks a user from a channel (does not check for operator privledge)
         
     | 
| 
      
 94 
     | 
    
         
            +
              def kick(channel, user, message)
         
     | 
| 
      
 95 
     | 
    
         
            +
                IRCConnection.send_to_server("KICK #{channel} #{user} :#{message || user || 'kicked'}")
         
     | 
| 
      
 96 
     | 
    
         
            +
              end
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
              # sets the topic of the given channel
         
     | 
| 
      
 99 
     | 
    
         
            +
              def set_topic(channel, topic)
         
     | 
| 
      
 100 
     | 
    
         
            +
                IRCConnection.send_to_server("TOPIC #{channel} :#{topic}");
         
     | 
| 
      
 101 
     | 
    
         
            +
              end
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
              # Sends a private message, or channel message
         
     | 
| 
      
 104 
     | 
    
         
            +
              def send_message(to, message)
         
     | 
| 
      
 105 
     | 
    
         
            +
                IRCConnection.send_to_server("privmsg #{to} :#{message}");
         
     | 
| 
      
 106 
     | 
    
         
            +
              end
         
     | 
| 
      
 107 
     | 
    
         
            +
              
         
     | 
| 
      
 108 
     | 
    
         
            +
              # Sends a notice
         
     | 
| 
      
 109 
     | 
    
         
            +
              def send_notice(to, message)
         
     | 
| 
      
 110 
     | 
    
         
            +
                IRCConnection.send_to_server("NOTICE #{to} :#{message}");
         
     | 
| 
      
 111 
     | 
    
         
            +
              end
         
     | 
| 
      
 112 
     | 
    
         
            +
              
         
     | 
| 
      
 113 
     | 
    
         
            +
              # performs an action
         
     | 
| 
      
 114 
     | 
    
         
            +
              def send_action(to, action)
         
     | 
| 
      
 115 
     | 
    
         
            +
                send_ctcp(to, 'ACTION', action);
         
     | 
| 
      
 116 
     | 
    
         
            +
              end
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
              # send CTCP
         
     | 
| 
      
 119 
     | 
    
         
            +
              def send_ctcp(to, type, message)
         
     | 
| 
      
 120 
     | 
    
         
            +
                IRCConnection.send_to_server("privmsg #{to} :\001#{type} #{message}");
         
     | 
| 
      
 121 
     | 
    
         
            +
              end
         
     | 
| 
      
 122 
     | 
    
         
            +
              
         
     | 
| 
      
 123 
     | 
    
         
            +
              # Quits the IRC Server
         
     | 
| 
      
 124 
     | 
    
         
            +
              def send_quit
         
     | 
| 
      
 125 
     | 
    
         
            +
                IRCConnection.send_to_server("QUIT : Quit ordered by user")
         
     | 
| 
      
 126 
     | 
    
         
            +
              end
         
     | 
| 
      
 127 
     | 
    
         
            +
              
         
     | 
| 
      
 128 
     | 
    
         
            +
              # Ops selected user.
         
     | 
| 
      
 129 
     | 
    
         
            +
              def op(channel, user)
         
     | 
| 
      
 130 
     | 
    
         
            +
                IRCConnection.send_to_server("MODE #{channel} +o #{user}")
         
     | 
| 
      
 131 
     | 
    
         
            +
              end
         
     | 
| 
      
 132 
     | 
    
         
            +
              
         
     | 
| 
      
 133 
     | 
    
         
            +
              # Changes the current nickname
         
     | 
| 
      
 134 
     | 
    
         
            +
              def ch_nick(nick)
         
     | 
| 
      
 135 
     | 
    
         
            +
                IRCConnection.send_to_server("NICK #{nick}")
         
     | 
| 
      
 136 
     | 
    
         
            +
                @nick = nick
         
     | 
| 
      
 137 
     | 
    
         
            +
              end
         
     | 
| 
      
 138 
     | 
    
         
            +
              
         
     | 
| 
      
 139 
     | 
    
         
            +
              # Removes operator status from a user
         
     | 
| 
      
 140 
     | 
    
         
            +
              def deop(channel, user)
         
     | 
| 
      
 141 
     | 
    
         
            +
                IRCConnection.send_to_server("MODE #{channel} -o #{user}")
         
     | 
| 
      
 142 
     | 
    
         
            +
              end
         
     | 
| 
      
 143 
     | 
    
         
            +
              
         
     | 
| 
      
 144 
     | 
    
         
            +
              # Changes target users mode
         
     | 
| 
      
 145 
     | 
    
         
            +
              def mode(channel, user, mode)
         
     | 
| 
      
 146 
     | 
    
         
            +
                IRCConnection.send_to_server("MODE #{channel} #{mode} #{user}")
         
     | 
| 
      
 147 
     | 
    
         
            +
              end
         
     | 
| 
      
 148 
     | 
    
         
            +
              
         
     | 
| 
      
 149 
     | 
    
         
            +
              # Retrievs user information from the server
         
     | 
| 
      
 150 
     | 
    
         
            +
              def get_user_info(user)
         
     | 
| 
      
 151 
     | 
    
         
            +
                IRCConnection.send_to_server("WHO #{user}")
         
     | 
| 
      
 152 
     | 
    
         
            +
              end
         
     | 
| 
      
 153 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/IRCConnection.rb
    CHANGED
    
    | 
         @@ -1,9 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         | 
| 
       2 
2 
     | 
    
         
             
            # Handles connection to IRC Server
         
     | 
| 
       3 
3 
     | 
    
         
             
            class IRCConnection
         
     | 
| 
       4 
     | 
    
         
            -
              @@quit 
     | 
| 
       5 
     | 
    
         
            -
              @@readsockets 
     | 
| 
       6 
     | 
    
         
            -
              @@ 
     | 
| 
      
 4 
     | 
    
         
            +
              @@quit          = 0
         
     | 
| 
      
 5 
     | 
    
         
            +
              @@readsockets   = Array.new(0)
         
     | 
| 
      
 6 
     | 
    
         
            +
              @@output_buffer = Array.new(0)
         
     | 
| 
      
 7 
     | 
    
         
            +
              @@events        = Hash.new()
         
     | 
| 
      
 8 
     | 
    
         
            +
              @@last_send     = Time.now.to_f
         
     | 
| 
      
 9 
     | 
    
         
            +
              @@message_delay = 0.2 # Default delay to 1 fifth of a second.
         
     | 
| 
       7 
10 
     | 
    
         
             
              # Creates a socket connection and then yields.
         
     | 
| 
       8 
11 
     | 
    
         
             
              def IRCConnection.handle_connection(server, port, nick='ChangeMe', realname='MeToo' )
         
     | 
| 
       9 
12 
     | 
    
         
             
                @server = server;
         
     | 
| 
         @@ -45,6 +48,12 @@ class IRCConnection 
     | 
|
| 
       45 
48 
     | 
    
         
             
                @@socket.write(line + "\n")
         
     | 
| 
       46 
49 
     | 
    
         
             
              end
         
     | 
| 
       47 
50 
     | 
    
         | 
| 
      
 51 
     | 
    
         
            +
              # Adds data an output buffer. This let's us keep a handle on how
         
     | 
| 
      
 52 
     | 
    
         
            +
              # fast we send things. Yay.
         
     | 
| 
      
 53 
     | 
    
         
            +
              def IRCConnection.output_push(line)
         
     | 
| 
      
 54 
     | 
    
         
            +
                @@output_buffer.push(line)
         
     | 
| 
      
 55 
     | 
    
         
            +
              end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
       48 
57 
     | 
    
         
             
              # This loop monitors all IO_Sockets IRCConnection controls
         
     | 
| 
       49 
58 
     | 
    
         
             
              # (including the IRC socket) and yields events to the IO_Sockets
         
     | 
| 
       50 
59 
     | 
    
         
             
              # event handler. 
         
     | 
| 
         @@ -59,24 +68,38 @@ class IRCConnection 
     | 
|
| 
       59 
68 
     | 
    
         
             
              # Makes one single loop pass, checking all sockets for data to read,
         
     | 
| 
       60 
69 
     | 
    
         
             
              # and yields the data to the sockets event handler.
         
     | 
| 
       61 
70 
     | 
    
         
             
              def IRCConnection.do_one_loop
         
     | 
| 
       62 
     | 
    
         
            -
                read_sockets = select(@@readsockets, nil, nil,  
     | 
| 
       63 
     | 
    
         
            -
                read_sockets 
     | 
| 
       64 
     | 
    
         
            -
                   
     | 
| 
       65 
     | 
    
         
            -
                     
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
                     
     | 
| 
      
 71 
     | 
    
         
            +
                read_sockets = select(@@readsockets, nil, nil, 0.1);
         
     | 
| 
      
 72 
     | 
    
         
            +
                if !read_sockets.nil?
         
     | 
| 
      
 73 
     | 
    
         
            +
                  read_sockets[0].each {|sock|
         
     | 
| 
      
 74 
     | 
    
         
            +
                    if sock.eof? && sock == @@socket
         
     | 
| 
      
 75 
     | 
    
         
            +
                      p "Detected Socket Close"
         
     | 
| 
      
 76 
     | 
    
         
            +
                      remove_IO_socket(sock)
         
     | 
| 
      
 77 
     | 
    
         
            +
                      sleep 10
         
     | 
| 
      
 78 
     | 
    
         
            +
                      handle_connection(@server, @port, @nick, @realname)
         
     | 
| 
      
 79 
     | 
    
         
            +
                    else
         
     | 
| 
      
 80 
     | 
    
         
            +
                      yield @@events[sock.to_i].call(sock)
         
     | 
| 
      
 81 
     | 
    
         
            +
                    end
         
     | 
| 
      
 82 
     | 
    
         
            +
                  }
         
     | 
| 
      
 83 
     | 
    
         
            +
                end
         
     | 
| 
      
 84 
     | 
    
         
            +
                if @@output_buffer.length > 0
         
     | 
| 
      
 85 
     | 
    
         
            +
                  timer = Time.now.to_f
         
     | 
| 
      
 86 
     | 
    
         
            +
                  if (timer > @@last_send + @@message_delay) 
         
     | 
| 
      
 87 
     | 
    
         
            +
                    message = @@output_buffer.shift();
         
     | 
| 
      
 88 
     | 
    
         
            +
                    if !message.nil?
         
     | 
| 
      
 89 
     | 
    
         
            +
                      IRCConnection.send_to_server(message);
         
     | 
| 
      
 90 
     | 
    
         
            +
                      @@last_send = timer
         
     | 
| 
      
 91 
     | 
    
         
            +
                    end
         
     | 
| 
       71 
92 
     | 
    
         
             
                  end
         
     | 
| 
       72 
     | 
    
         
            -
                 
     | 
| 
      
 93 
     | 
    
         
            +
                end
         
     | 
| 
       73 
94 
     | 
    
         
             
              end
         
     | 
| 
       74 
95 
     | 
    
         | 
| 
       75 
96 
     | 
    
         
             
              # Ends connection to the irc server
         
     | 
| 
       76 
97 
     | 
    
         
             
              def IRCConnection.quit
         
     | 
| 
       77 
98 
     | 
    
         
             
                @@quit = 1
         
     | 
| 
       78 
99 
     | 
    
         
             
              end 
         
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
      
 100 
     | 
    
         
            +
              def IRCConnection.delay=(delay)
         
     | 
| 
      
 101 
     | 
    
         
            +
                @@message_delay = delay.to_f
         
     | 
| 
      
 102 
     | 
    
         
            +
              end
         
     | 
| 
       80 
103 
     | 
    
         
             
              # Retrieves user info from the server
         
     | 
| 
       81 
104 
     | 
    
         
             
              def IRCConnection.get_user_info(user)
         
     | 
| 
       82 
105 
     | 
    
         
             
                IRCConnection.send_to_server("WHOIS #{user}")
         
     | 
| 
         @@ -88,7 +111,7 @@ class IRCConnection 
     | 
|
| 
       88 
111 
     | 
    
         
             
                @@events[socket.to_i] = event_generator
         
     | 
| 
       89 
112 
     | 
    
         
             
              end
         
     | 
| 
       90 
113 
     | 
    
         | 
| 
       91 
     | 
    
         
            -
              def IRCConnection.remove_IO_socket( 
     | 
| 
      
 114 
     | 
    
         
            +
              def IRCConnection.remove_IO_socket(sock)
         
     | 
| 
       92 
115 
     | 
    
         
             
                sock.close
         
     | 
| 
       93 
116 
     | 
    
         
             
                @@readsockets.delete_if {|item| item == sock }
         
     | 
| 
       94 
117 
     | 
    
         
             
              end
         
     | 
| 
         @@ -0,0 +1,97 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
             
     | 
| 
      
 2 
     | 
    
         
            +
            # Handles connection to IRC Server
         
     | 
| 
      
 3 
     | 
    
         
            +
            class IRCConnection
         
     | 
| 
      
 4 
     | 
    
         
            +
              @@quit = 0
         
     | 
| 
      
 5 
     | 
    
         
            +
              @@readsockets = Array.new(0)
         
     | 
| 
      
 6 
     | 
    
         
            +
              @@events      = Hash.new()
         
     | 
| 
      
 7 
     | 
    
         
            +
              # Creates a socket connection and then yields.
         
     | 
| 
      
 8 
     | 
    
         
            +
              def IRCConnection.handle_connection(server, port, nick='ChangeMe', realname='MeToo' )
         
     | 
| 
      
 9 
     | 
    
         
            +
                @server = server;
         
     | 
| 
      
 10 
     | 
    
         
            +
                @port = port
         
     | 
| 
      
 11 
     | 
    
         
            +
                @nick = nick
         
     | 
| 
      
 12 
     | 
    
         
            +
                @realname = realname
         
     | 
| 
      
 13 
     | 
    
         
            +
                socket = create_tcp_socket(server, port)
         
     | 
| 
      
 14 
     | 
    
         
            +
                add_IO_socket(socket) {|sock| 
         
     | 
| 
      
 15 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 16 
     | 
    
         
            +
                    IRCEvent.new(sock.readline.chomp) 
         
     | 
| 
      
 17 
     | 
    
         
            +
                  rescue Errno::ECONNRESET
         
     | 
| 
      
 18 
     | 
    
         
            +
                    # Catches connection reset by peer, attempts to reconnect
         
     | 
| 
      
 19 
     | 
    
         
            +
                    # after sleeping for 10 second.
         
     | 
| 
      
 20 
     | 
    
         
            +
                    remove_IO_socket(sock)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    sleep 10
         
     | 
| 
      
 22 
     | 
    
         
            +
                    handle_connection(@server, @port, @nick, @realname)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
                }
         
     | 
| 
      
 25 
     | 
    
         
            +
                send_to_server "NICK #{nick}"
         
     | 
| 
      
 26 
     | 
    
         
            +
                send_to_server "USER #{nick} 8 * :#{realname}"
         
     | 
| 
      
 27 
     | 
    
         
            +
                if block_given?
         
     | 
| 
      
 28 
     | 
    
         
            +
                  yield
         
     | 
| 
      
 29 
     | 
    
         
            +
                  @@socket.close
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
              
         
     | 
| 
      
 33 
     | 
    
         
            +
              def IRCConnection.create_tcp_socket(server, port)
         
     | 
| 
      
 34 
     | 
    
         
            +
                @@socket = TCPsocket.open(server, port)
         
     | 
| 
      
 35 
     | 
    
         
            +
                if block_given?
         
     | 
| 
      
 36 
     | 
    
         
            +
                  yield
         
     | 
| 
      
 37 
     | 
    
         
            +
                  @@socket.close
         
     | 
| 
      
 38 
     | 
    
         
            +
                  return
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
                return @@socket
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
              
         
     | 
| 
      
 43 
     | 
    
         
            +
              # Sends a line of text to the server
         
     | 
| 
      
 44 
     | 
    
         
            +
              def IRCConnection.send_to_server(line)
         
     | 
| 
      
 45 
     | 
    
         
            +
                @@socket.write(line + "\n")
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
              
         
     | 
| 
      
 48 
     | 
    
         
            +
              # This loop monitors all IO_Sockets IRCConnection controls
         
     | 
| 
      
 49 
     | 
    
         
            +
              # (including the IRC socket) and yields events to the IO_Sockets
         
     | 
| 
      
 50 
     | 
    
         
            +
              # event handler. 
         
     | 
| 
      
 51 
     | 
    
         
            +
              def IRCConnection.main
         
     | 
| 
      
 52 
     | 
    
         
            +
                while(@@quit == 0)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  do_one_loop { |event|
         
     | 
| 
      
 54 
     | 
    
         
            +
                    yield event
         
     | 
| 
      
 55 
     | 
    
         
            +
                  }
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
              # Makes one single loop pass, checking all sockets for data to read,
         
     | 
| 
      
 60 
     | 
    
         
            +
              # and yields the data to the sockets event handler.
         
     | 
| 
      
 61 
     | 
    
         
            +
              def IRCConnection.do_one_loop
         
     | 
| 
      
 62 
     | 
    
         
            +
                read_sockets = select(@@readsockets, nil, nil, nil);
         
     | 
| 
      
 63 
     | 
    
         
            +
                read_sockets[0].each {|sock|
         
     | 
| 
      
 64 
     | 
    
         
            +
                  if sock.eof? && sock == @@socket
         
     | 
| 
      
 65 
     | 
    
         
            +
                    p "Detected Socket Close"
         
     | 
| 
      
 66 
     | 
    
         
            +
                    remove_IO_socket(sock)
         
     | 
| 
      
 67 
     | 
    
         
            +
                    sleep 10
         
     | 
| 
      
 68 
     | 
    
         
            +
                    handle_connection(@server, @port, @nick, @realname)
         
     | 
| 
      
 69 
     | 
    
         
            +
                  else
         
     | 
| 
      
 70 
     | 
    
         
            +
                    yield @@events[sock.to_i].call(sock)
         
     | 
| 
      
 71 
     | 
    
         
            +
                  end
         
     | 
| 
      
 72 
     | 
    
         
            +
                }
         
     | 
| 
      
 73 
     | 
    
         
            +
              end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
              # Ends connection to the irc server
         
     | 
| 
      
 76 
     | 
    
         
            +
              def IRCConnection.quit
         
     | 
| 
      
 77 
     | 
    
         
            +
                @@quit = 1
         
     | 
| 
      
 78 
     | 
    
         
            +
              end 
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
              # Retrieves user info from the server
         
     | 
| 
      
 81 
     | 
    
         
            +
              def IRCConnection.get_user_info(user)
         
     | 
| 
      
 82 
     | 
    
         
            +
                IRCConnection.send_to_server("WHOIS #{user}")
         
     | 
| 
      
 83 
     | 
    
         
            +
              end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
              # Adds a new socket to the list of sockets to monitor for new data.
         
     | 
| 
      
 86 
     | 
    
         
            +
              def IRCConnection.add_IO_socket(socket, &event_generator)
         
     | 
| 
      
 87 
     | 
    
         
            +
                @@readsockets.push(socket)
         
     | 
| 
      
 88 
     | 
    
         
            +
                @@events[socket.to_i] = event_generator
         
     | 
| 
      
 89 
     | 
    
         
            +
              end
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
              def IRCConnection.remove_IO_socket(socket)
         
     | 
| 
      
 92 
     | 
    
         
            +
                sock.close
         
     | 
| 
      
 93 
     | 
    
         
            +
                @@readsockets.delete_if {|item| item == sock }
         
     | 
| 
      
 94 
     | 
    
         
            +
              end
         
     | 
| 
      
 95 
     | 
    
         
            +
            end
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
    
        data/lib/IRCEvent.rb
    CHANGED
    
    | 
         @@ -40,7 +40,8 @@ class IRCEvent 
     | 
|
| 
       40 
40 
     | 
    
         
             
                  @from    = @stats[0] 
         
     | 
| 
       41 
41 
     | 
    
         
             
                  @user    = IRCUser.create_user(@from)
         
     | 
| 
       42 
42 
     | 
    
         
             
                end
         
     | 
| 
       43 
     | 
    
         
            -
                 
     | 
| 
      
 43 
     | 
    
         
            +
                # FIXME: this list would probably be more accurate to exclude commands than to include them
         
     | 
| 
      
 44 
     | 
    
         
            +
                @hostmask = @stats[1] if %W(topic privmsg join).include? @event_type
         
     | 
| 
       44 
45 
     | 
    
         
             
                @channel = @stats[3] if @stats[3] && !@channel
         
     | 
| 
       45 
46 
     | 
    
         
             
                @target  = @stats[5] if @stats[5]
         
     | 
| 
       46 
47 
     | 
    
         
             
                @mode    = @stats[4] if @stats[4]
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,10 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification 
         
     | 
| 
       2 
     | 
    
         
            -
            rubygems_version: 0. 
     | 
| 
      
 2 
     | 
    
         
            +
            rubygems_version: 0.9.0
         
     | 
| 
       3 
3 
     | 
    
         
             
            specification_version: 1
         
     | 
| 
       4 
4 
     | 
    
         
             
            name: Ruby-IRC
         
     | 
| 
       5 
5 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       6 
     | 
    
         
            -
              version: 1.0. 
     | 
| 
       7 
     | 
    
         
            -
            date:  
     | 
| 
      
 6 
     | 
    
         
            +
              version: 1.0.10
         
     | 
| 
      
 7 
     | 
    
         
            +
            date: 2007-11-07 00:00:00 -08:00
         
     | 
| 
       8 
8 
     | 
    
         
             
            summary: An IRC Client library
         
     | 
| 
       9 
9 
     | 
    
         
             
            require_paths: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            - lib
         
     | 
| 
         @@ -25,16 +25,19 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement 
     | 
|
| 
       25 
25 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       26 
26 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       27 
27 
     | 
    
         
             
            cert_chain: 
         
     | 
| 
      
 28 
     | 
    
         
            +
            post_install_message: 
         
     | 
| 
       28 
29 
     | 
    
         
             
            authors: 
         
     | 
| 
       29 
30 
     | 
    
         
             
            - Chris Boyer
         
     | 
| 
       30 
31 
     | 
    
         
             
            files: 
         
     | 
| 
       31 
32 
     | 
    
         
             
            - lib/IRCEvent.rb
         
     | 
| 
       32 
33 
     | 
    
         
             
            - lib/IRC.rb
         
     | 
| 
      
 34 
     | 
    
         
            +
            - lib/IRC.rb.~1.8.~
         
     | 
| 
       33 
35 
     | 
    
         
             
            - lib/IRCChannel.rb
         
     | 
| 
       34 
36 
     | 
    
         
             
            - lib/IRCConnection.rb
         
     | 
| 
       35 
37 
     | 
    
         
             
            - lib/IRCUser.rb
         
     | 
| 
       36 
38 
     | 
    
         
             
            - lib/IRCUtil.rb
         
     | 
| 
       37 
39 
     | 
    
         
             
            - lib/eventmap.yml
         
     | 
| 
      
 40 
     | 
    
         
            +
            - lib/IRCConnection.rb.~1.4.~
         
     | 
| 
       38 
41 
     | 
    
         
             
            - README
         
     | 
| 
       39 
42 
     | 
    
         
             
            test_files: []
         
     | 
| 
       40 
43 
     | 
    
         |