class RFlow::Components::IRC::Client::Connection

@!visibility private

Attributes

client[RW]

@!visibility private

client_ip[R]

@!visibility private

client_port[R]

@!visibility private

server_ip[R]

@!visibility private

server_port[R]

@!visibility private

Public Instance Methods

command(cmd, args = [], prefix = nil) click to toggle source

@!visibility private

# File lib/rflow/components/irc/client.rb, line 234
def command(cmd, args = [], prefix = nil)
  RFlow.logger.debug { "#{client.name}: command: '#{cmd}' with args ['#{args.join("', '")}'] and prefix '#{prefix}'" }
  line = ''
  if prefix
    line << ":#{prefix} "
  end

  line << cmd.upcase

  last_arg = args.pop
  line << " #{args.join ' '}" unless args.empty?

  if last_arg =~ /\s/;
    line << ' :' << last_arg
  else
    line << ' ' << last_arg
  end

  send_irc_line line
end
connection_completed() click to toggle source

@!visibility private

# File lib/rflow/components/irc/client.rb, line 161
def connection_completed
  @reconnecting = false
  @connected = true

  RFlow.logger.info "#{client.name}: Connected to IRC server #{client.config['server']}:#{client.config['port']}"

  command "PASS", [client.config['server_password']] unless client.config['server_password'].nil?
  command "NICK", [client.config['nickname']]
  command "USER", [client.config['username'], client.config['username'], client.config['username'], client.config['username']]
  command "NickServ IDENTIFY", [client.config['nickname'], client.config['nickserv_password']] unless client.config['nickserv_password'].nil?
  command "OPER", [client.config['oper_user'] || client.config['nickname'], client.config['oper_password']] unless client.config['oper_password'].nil?
end
post_init() click to toggle source

@!visibility private

Calls superclass method
# File lib/rflow/components/irc/client.rb, line 154
def post_init
  @client_port, @client_ip = Socket.unpack_sockaddr_in(get_peername) rescue ["?", "?.?.?.?"]
  @server_port, @server_ip = Socket.unpack_sockaddr_in(get_sockname) rescue ["?", "?.?.?.?"]
  super
end
receive_line(line) click to toggle source

@!visibility private

# File lib/rflow/components/irc/client.rb, line 175
def receive_line(line)
  RFlow.logger.debug { "#{client.name}: IRCClient#receive_line: #{line}" }
  prefix, cmd, params = IRC.parse_irc_line(line)

  # Now have an optional prefix, required cmd, and optional param array
  case cmd
  when /PING/
    command('PONG', params)
  else
    # create an IRC message here and send it along
    RFlow.logger.debug { "#{client.name}: Sending IRC message '#{line}', signature '#{signature.class}:#{signature}', '#{signature.to_s.class}:#{signature.to_s}'" }

    client.from_server.send_message(RFlow::Message.new('RFlow::Message::Data::IRC::Message').tap do |m|
      m.data.prefix = prefix
      m.data.command = cmd
      m.data.parameters = params
      m.provenance << RFlow::Message::ProcessingEvent.new(client.uuid, Time.now.utc).tap do |e|
        e.context = signature.to_s
        e.completed_at = Time.now.utc
      end
    end)
  end
end
send_irc_line(line) click to toggle source

@!visibility private

# File lib/rflow/components/irc/client.rb, line 228
def send_irc_line(line)
  RFlow.logger.debug { "#{client.name}: Sending line '#{line}'" }
  send_data "#{line}\r\n"
end
send_irc_message(irc_message) click to toggle source

@!visibility private

# File lib/rflow/components/irc/client.rb, line 222
def send_irc_message(irc_message)
  RFlow.logger.debug { "#{client.name}: Sending an IRC message to #{client_ip}:#{client_port}" }
  command irc_message.data.command, irc_message.data.parameters, irc_message.data.prefix
end
unbind(reason = nil) click to toggle source

@!visibility private

# File lib/rflow/components/irc/client.rb, line 200
def unbind(reason = nil)
  if @connected || @reconnecting
    RFlow.logger.error "#{client.name}: Disconnected from IRC server #{client.config['server']}:#{client.config['port']} due to '#{reason}', reconnecting ..."

    client.log_port.send_message(RFlow::Message.new('RFlow::Message::Data::Log').tap do |m|
      m.data.timestamp = Integer(Time.now.to_f * 1000) # ms since epoch
      m.data.level = 'INFO'
      m.data.text = "IRC disconnected. Reconnecting in #{client.config['reconnect_interval']} seconds."
    end)

    EM.add_timer(client.config['reconnect_interval']) do
      RFlow.logger.info "#{client.name}: Attempting reconnect to IRC server #{client.config['server']}:#{client.config['port']}"
      reconnect(client.config['server'], client.config['port'])
    end
    @connected = false
    @reconnecting = true
  else
    raise RuntimeError, "Unable to connect to IRC server #{client.config['server']}:#{client.config['port']} due to '#{reason}'"
  end
end