class WoopraTrack::Tracker

Public Class Methods

new(request) click to toggle source
# File lib/woopra_track/tracker.rb, line 26
def initialize(request)
  @request          = request
  @current_config   = @@default_config
  @custom_config    = { app: @@application_id }
  @user             = {}
  @events           = []
  @user_up_to_date  = true
  @has_pushed       = false
  @disable_tracking = false

  @current_config[:domain]        = @request.host
  @current_config[:cookie_domain] = @request.host
  @current_config[:ip_address]    = get_client_ip
  @current_config[:cookie_value]  = @request.cookies[@current_config[:cookie_name]] || random_cookie
end

Public Instance Methods

config(data) click to toggle source
# File lib/woopra_track/tracker.rb, line 46
def config(data)
  data   = Hash(data)
  custom = data.select { |k, _v| k.in? @@default_config.keys }
  custom = custom.except(:ip_address, :cookie_value)

  @custom_config     = @custom_config.merge(custom)
  @disable_tracking  = data[:disable_tracking].is_a? TrueClass
end
enable_logging() click to toggle source
# File lib/woopra_track/tracker.rb, line 42
def enable_logging
  @logger = Logger.new(STDOUT)
end
identify(user) click to toggle source
# File lib/woopra_track/tracker.rb, line 55
def identify(user)
  @user            = user
  @user_up_to_date = false
end
javascript_tag() click to toggle source
# File lib/woopra_track/tracker.rb, line 93
def javascript_tag
  return if disable_tracking?

  code = ['(function(){var t,i,e,n=window,o=document,a=arguments,s="script",r=["config","track","trackForm","trackClick","identify","visit","push","call"],c=function(){var t,i=this;for(i._e=[],t=0;r.length>t;t++)(function(t){i[t]=function(){return i._e.push([t].concat(Array.prototype.slice.call(arguments,0))),i}})(r[t])};for(n._w=n._w||{},t=0;a.length>t;t++)n._w[a[t]]=n[a[t]]=n[a[t]]||new c;i=o.createElement(s),i.async=1,i.src="//static.woopra.com/js/w.js",e=o.getElementsByTagName(s)[0],e.parentNode.insertBefore(i,e)})("woopra");']

  code << "woopra.config(#{@custom_config.to_json});" if @custom_config.length != 0
  code << "woopra.identify(#{@user.to_json});" if not @user_up_to_date

  @events.each do |event|
    if event.first.nil?
      code << "woopra.track();"
    else
      code << "woopra.track('#{event.first}', #{event.second.to_json});"
    end
  end

  code << "woopra.push();" if @has_pushed

  "<script>\n#{code.join("\n")}\n</script>".html_safe
end
push(back_end=false) click to toggle source
# File lib/woopra_track/tracker.rb, line 83
def push(back_end=false)
  if not @user_up_to_date
    if back_end
      http_request()
    else
      @has_pushed = true
    end
  end
end
track(*args) click to toggle source
# File lib/woopra_track/tracker.rb, line 60
def track(*args)
  event_name = nil
  event_data = nil
  back_end   = false

  args.each do |param|
    case param
    when String
      event_name = param
    when Hash
      event_data = param
    when TrueClass
      back_end = param
    end
  end

  if back_end
    http_request([event_name, event_data])
  else
    @events << [event_name, event_data]
  end
end

Private Instance Methods

disable_tracking?() click to toggle source
# File lib/woopra_track/tracker.rb, line 180
def disable_tracking?
  @disable_tracking.is_a? TrueClass
end
get_client_ip() click to toggle source
# File lib/woopra_track/tracker.rb, line 172
def get_client_ip
  if not @request.env['HTTP_X_FORWARDED_FOR'].nil?
    @request.env['HTTP_X_FORWARDED_FOR'].split(',').first.strip
  else
    @request.remote_ip
  end
end
http_request(event=nil) click to toggle source
# File lib/woopra_track/tracker.rb, line 121
def http_request(event=nil)
  return if disable_tracking?

  request_url = 'https://www.woopra.com'
  get_params  = {
    host:    @current_config[:domain],
    cookie:  @current_config[:cookie_value],
    ip:      @current_config[:ip_address],
    timeout: @current_config[:idle_timeout]
  }

  user_params = Hash[@user.map { |k, v| [:"cv_#{k}", "#{v}"] }]
  get_params  = get_params.merge(user_params)

  if event.nil?
    request_url = URI.join(request_url, 'track/identify')
  else
    request_url = URI.join(request_url, 'track/ce')

    if event.first.nil?
      get_params = get_params.merge(event: 'pv', ce_url: @request.url)
    else
      event_data = Hash[Array(event.second).map { |k, v| [:"ce_#{k}", "#{v}"] }]
      get_params = get_params.merge(event: event.first).merge(event_data)
    end
  end

  request_url.query = URI.encode_www_form(get_params.merge(ce_app: @@application_id))
  request_headers   = { 'User-Agent' => @request.env['HTTP_USER_AGENT'] }
  request_response  = Typhoeus.get(request_url, headers: request_headers)

  log_request(request_response, request_url) if @logger
end
log_request(response, url) click to toggle source
# File lib/woopra_track/tracker.rb, line 155
def log_request(response, url)
  if response.success?
    @logger.info("Woopra") { "Success: #{url}" }
  elsif response.timed_out?
    @logger.warn("Woopra") { "Timeout: #{url}" }
  elsif response.code == 0
    @logger.error("Woopra") { "#{response.return_message}, #{url}" }
  else
    @logger.error("Woopra") { "WOOPRA Failed: #{response.code}, #{url}" }
  end
end