class MCLib::EventFactory

Constants

Chat
Login
Unknown
Warning

Public Instance Methods

build(message, meta_data, type) click to toggle source
# File lib/mclib/event_factory.rb, line 10
def build(message, meta_data, type)
  if type == :warn
    return Warning.new message
  end

  @message, @meta_data = message, meta_data

  case detect_event
  when :chat
    parse_chat
  when :login
    parse_login
  when :unknown
    Unknown.new message, meta_data
  else
    Unknown.new message, meta_data
  end
end

Private Instance Methods

detect_event() click to toggle source
# File lib/mclib/event_factory.rb, line 31
def detect_event
  if @message.chars[0] == '<'
    :chat
  elsif @message.include? 'logged in'
    :login
  else
    :unknown
  end
end
parse_chat() click to toggle source
# File lib/mclib/event_factory.rb, line 41
def parse_chat
  name = ''
  text = ''
  stopped_at = 0

  @message.chars.each_with_index do |char, index|
    if char == '<'
      next
    elsif char == '>'
      text = @message[index + 2..-1] # + 2 to skip trailing angle bracket and space
      break
    else
      name << char
    end
  end

  Chat.new name, text
end
parse_login() click to toggle source
# File lib/mclib/event_factory.rb, line 60
def parse_login
  name = ''
  ip = ''

  stopped_at = 0

  @message.chars.each_with_index do |char, index|
    if char != '['
      name << char
    else
      stopped_at = index + 2
      break
    end
  end

  @message.chars[stopped_at..-1].each_with_index do |char, index|
    if char != ':'
      ip << char
    else
      break
    end
  end

  coordinates = @message.match(/\(.*\)/)[0]
  coordinates.slice! 0
  coordinates.chomp! ')'
  coordinates = coordinates.split(', ').map { |point| point.to_i }
  coordinates = { :x => coordinates[0], :y => coordinates[1], :z => coordinates[2] }

  Login.new name, ip, coordinates
end