class CSGOLytics::LogListener

Constants

REMOTE_LOG_PKT_HEADER

Public Class Methods

new(config) click to toggle source
# File lib/csgolytics/log_listener.rb, line 9
def initialize(config)
  @ssock = UDPSocket.new
  @ssock.bind("0.0.0.0", 3764)
  @callbacks = []

  @remotes_map = {}
  config["servers"].each do |server|
    server["remote_addrs"].each do |remote_addr|
      @remotes_map[remote_addr] = server["server_id"]
    end
  end
end

Public Instance Methods

listen() click to toggle source
# File lib/csgolytics/log_listener.rb, line 22
def listen
  while msg = @ssock.recvfrom(0xffff)
    payload, raddr = msg
    payload = payload.force_encoding("utf-8")

    remote_addrs = [
      "#{raddr[2]}:#{raddr[1]}",
      "#{raddr[3]}:#{raddr[1]}"
    ].uniq

    remote_server_id = nil
    remote_addrs.each do |r|
    remote_server_id ||= @remotes_map[r]
    end

    unless remote_server_id
      $stderr.puts "WARNING: unknown server: #{remote_addrs.inspect}"
      next
    end

    unless payload.start_with?(REMOTE_LOG_PKT_HEADER)
      $stderr.puts "WARNING: received invalid log packet"
      next
    end

    logline = payload[REMOTE_LOG_PKT_HEADER.length..-1]
    while ["\0", "\r", "\n"].include?(logline[-1])
      logline = logline[0..-2]
    end

    @callbacks.each do |cb|
      cb[logline, remote_server_id]
    end
  end
end
on_logline(&cb) click to toggle source
# File lib/csgolytics/log_listener.rb, line 58
def on_logline(&cb)
  @callbacks << cb
end