Module: IRCMachine::Reply

Defined in:
lib/ircmachine/reply.rb

Class Method Summary collapse

Class Method Details

.defrpl(code, name, *arg_names) ⇒ Object

Raises:

  • (ArgumentError)


27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/ircmachine/reply.rb', line 27

def defrpl(code, name, *arg_names)
  raise ArgumentError, 'Code must be 3 digits.' unless code =~ /^\d{3}$/

  klass = Class.new do
    define_method(:initialize) do |prefix, *args|
      @prefix = prefix
      arg_names.zip(args).each { |name, value| instance_variable_set("@#{name}", value) }
    end

    arg_names.each do |name|
      define_method(name) { instance_variable_get("@#{name}") }
    end

    define_method(:prefix)  { @prefix }
    define_method(:code)    { code }

    define_method(:to_msg) do
      param_values = arg_names.map { |k| instance_variable_get("@#{k}") }.join(' ')
      IRCMachine::Message.new(@prefix, code, param_values)
    end

    define_method(:to_s) { self.to_msg.to_s }
  end

  class_name = "#{name.to_s.split('_').map(&:capitalize).join('')}Reply"
  const_set(class_name, klass)

  replies[code] = klass
end

.from_msg(msg) ⇒ Object



11
12
13
14
15
16
17
# File 'lib/ircmachine/reply.rb', line 11

def from_msg(msg)
  if (klass = replies[msg.command]).nil?
    fail ArgumentError, "Unknown reply: #{msg.command}"
  else
    klass.new(msg.prefix, *msg.params)
  end
end

.parse(str) ⇒ Object



19
20
21
22
23
24
25
# File 'lib/ircmachine/reply.rb', line 19

def parse(str)
  if (msg = IRCMachine::Message.parse(str)).nil?
    fail ArgumentError, 'Invalid format for IRC message.'
  else
    from_msg(msg)
  end
end

.repliesObject



6
7
8
# File 'lib/ircmachine/reply.rb', line 6

def replies
  @replies ||= {}
end