module Geolocate

Public Class Methods

find_from_ip(ip, options = {}) click to toggle source
# File lib/geolocate.rb, line 7
def self.find_from_ip(ip, options = {})
  return nil unless ip =~ /\A(\d+)\.(\d+)\.(\d+)\.(\d+)\z/
  options[:timeout] ||= 4
  Timeout.timeout(options[:timeout]) do 
    result = Net::HTTP.get("ip-api.com", "/json/#{ip}") rescue nil
    if result && json = (JSON.parse(result) rescue nil)
      if json['status'] == 'success'
        result = Result.new
        result.ip = json['query']
        result.country = json['country']
        result.country_code = json['countryCode']
        result.city = json['city']
        result.time_zone = json['timezone']
        result.latitude = json['lat']
        result.longitude = json['lon']
        result.isp = json['isp']
        result.organization = json['org']
        result
      else
        false
      end
    end
  end
rescue Timeout::Error
  false
end