class ImplicitData attr_accessor :env, :browser, :platform, :referer, :geo_data # # initialize def initialize(request) # raw data self.env = request # Gain implicit data getPlatform getBrowser getGeoData end protected # # uses hostip.info to gain a range of geo data for the user def getGeoData self.geo_data = { :country => nil, :city => nil, :country_abbrev => nil, :longitude => nil, :latitude => nil } if !self.env['REMOTE_ADDR'].blank? # Set var's ps_ip = self.env['REMOTE_ADDR'] # if in test of development use this ip address ps_ip = '81.109.157.227' unless self.env['RAILS_ENV'] == 'production' ps_hostip_uri = "http://api.hostip.info?ip=#{CGI.escape ps_ip}" # Recover from any timeout begin # get the url url = URI.parse(ps_hostip_uri) http = Net::HTTP.new(url.host, url.port) http.open_timeout = 3 http.read_timeout = 3 # Make request response = http.start do |http| http.get(url.request_uri) end # Parse xml and grab the results po_xml = REXML::Document.new response.body # Check to see if there is a valid country if po_xml.root.elements["/HostipLookupResultSet/gml:featureMember/Hostip/countryAbbrev"].get_text.value != "XX" self.geo_data[:country] = po_xml.root.elements["/HostipLookupResultSet/gml:featureMember/Hostip/countryName"].get_text.value self.geo_data[:city] = po_xml.root.elements["/HostipLookupResultSet/gml:featureMember/Hostip/gml:name"].get_text.value self.geo_data[:country_abbrev] = po_xml.root.elements["/HostipLookupResultSet/gml:featureMember/Hostip/countryAbbrev"].get_text.value # Check if exists if po_xml.root.elements["/HostipLookupResultSet/gml:featureMember/Hostip/ipLocation/gml:PointProperty/gml:Point/gml:coordinates"] self.geo_data[:longitude], self.geo_data[:latitude] = po_xml.root.elements["/HostipLookupResultSet/gml:featureMember/Hostip/ipLocation/gml:PointProperty/gml:Point/gml:coordinates"].get_text.value.split(",",2) end end # Format the words correctly self.geo_data[:country] = self.geo_data[:country].split(" ").each{|word| word.capitalize!}.join(" ") self.geo_data[:city] = self.geo_data[:city].split(" ").each{|word| word.capitalize!}.join(" ") rescue Timeout::Error #Connection failed end #end Timeout::Error end #end if end # # gets the users platform def getPlatform # Catch error just in case platform data can not be found begin if self.env['HTTP_USER_AGENT'] =~ /Win/i self.platform = "Windows" elsif self.env['HTTP_USER_AGENT'] =~ /Mac/i self.platform = "Mac" elsif self.env['HTTP_USER_AGENT'] =~ /BSD/i self.platform = "FreeBSD"; elsif self.env['HTTP_USER_AGENT'] =~ /Linux/i self.platform = "Linux"; elsif self.env['HTTP_USER_AGENT'] =~ /SunOS/i self.platform = "Sun Solaris"; elsif self.env["HTTP_USER_AGENT"] =~ /iPhone/i self.platform = "iPhone"; else self.platform = nil end rescue self.platform = nil end end # # gets the current browser and the version def getBrowser self.browser = { :type => nil, :version => nil, :raw => nil } # catch error just in case browser agent can not be found begin #Internet Exlorer if self.env['HTTP_USER_AGENT'] =~ /MSIE/i && self.env['HTTP_USER_AGENT'].scan(/AOL|America Online Browser/i).empty? browser[:type] = "MSIE"; browser[:version] = self.env['HTTP_USER_AGENT'].scan(/MSIE ([\d\.]+)/i).to_s #Firefox/Firebird/Phoenix elsif self.env['HTTP_USER_AGENT'] =~ /Firefox|Firebird|Phoenix/i browser[:type] = "Firefox"; browser[:version] = self.env['HTTP_USER_AGENT'].scan(/[Firefox|Firebird|Phoenix].\/(\d.+)/i).to_s #Galeon elsif self.env['HTTP_USER_AGENT'] =~ /Galeon/i browser[:type] = "Galeon"; browser[:version] = self.env['HTTP_USER_AGENT'].scan(/Galeon\/([\d\.]+)/i).to_s #Safari elsif self.env['HTTP_USER_AGENT'] =~ /Safari/i browser[:type] = "Safari"; browser[:version] = '0' #Opera elsif self.env['HTTP_USER_AGENT'] =~ /Opera/i browser[:type] = "Opera"; browser[:version] = self.env['HTTP_USER_AGENT'].scan(/Opera[ |\/]([\d\.]+)/i).to_s #AOL/America Online Browser elsif self.env['HTTP_USER_AGENT'] =~ /AOL|America Online Browser/i browser[:type] = "AOL" browser[:version] = if self.env['HTTP_USER_AGENT'] =~ /AOL/i self.env['HTTP_USER_AGENT'].scan(/AOL[ |\/]([\d.]+)/i).uniq.to_s else self.env['HTTP_USER_AGENT'].scan(/America Online Browser ([\d\.]+)/i).to_s end #Camino elsif self.env['HTTP_USER_AGENT'] =~ /Camino/i browser[:type] = "Camino"; browser[:version] = self.env['HTTP_USER_AGENT'].scan(/Camino\/([\d\.]+)/i).to_s #Konqueror elsif self.env['HTTP_USER_AGENT'] =~ /Konqueror/i browser[:type] = "Konqueror"; browser[:version] = self.env['HTTP_USER_AGENT'].scan(/Konqueror\/([\d.]+)/i).to_s #K-Meleon elsif self.env['HTTP_USER_AGENT'] =~ /K-Meleon/i browser[:type] = "K-Meleon"; browser[:version] = self.env['HTTP_USER_AGENT'].scan(/K-Meleon\/([\d.]+)/i).to_s #Firefox BonEcho elsif self.env['HTTP_USER_AGENT'] =~ /BonEcho/i browser[:type] = "Firefox BonEcho"; browser[:version] = self.env['HTTP_USER_AGENT'].scan(/BonEcho\/([\d.]+)/i).to_s #Netscape elsif self.env['HTTP_USER_AGENT'] =~ /Netscape/i browser[:type] = "Netscape"; browser[:version] = self.env['HTTP_USER_AGENT'].scan(/Netscape\/([\d.]+)/i).to_s #PSP elsif self.env['HTTP_USER_AGENT'] =~ /PlayStation Portable/i browser[:type] = "PlayStation Portable (PSP)"; browser[:version] = self.env['HTTP_USER_AGENT'].scan(/PlayStation Portable\); ([\d\.]+)/i).to_s #PlayStation 3 elsif self.env['HTTP_USER_AGENT'] =~ /PlayStation 3/i browser[:type] = "PlayStation 3"; browser[:version] = self.env['HTTP_USER_AGENT'].scan(/PlayStation 3; ([\d\.]+)/i).to_s #Lynx elsif self.env['HTTP_USER_AGENT'] =~ /Lynx/i browser[:type] = "Lynx"; browser[:version] = self.env['HTTP_USER_AGENT'].scan(/Lynx\/([\d\.]+)/i).to_s else browser[:type] = nil browser[:version] = nil end browser[:raw] = self.env['HTTP_USER_AGENT'] rescue #catech error browser[:type] = nil browser[:version] = nil end end end