You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.0 KiB
111 lines
3.0 KiB
<?php
|
|
|
|
/*
|
|
|
|
Copyright (c) 2009-2019 F3::Factory/Bong Cosca, All rights reserved.
|
|
|
|
This file is part of the Fat-Free Framework (http://fatfreeframework.com).
|
|
|
|
This is free software: you can redistribute it and/or modify it under the
|
|
terms of the GNU General Public License as published by the Free Software
|
|
Foundation, either version 3 of the License, or later.
|
|
|
|
Fat-Free Framework is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with Fat-Free Framework. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
namespace Web;
|
|
|
|
//! Geo plug-in
|
|
class Geo extends \Prefab {
|
|
|
|
/**
|
|
* Return information about specified Unix time zone
|
|
* @return array
|
|
* @param $zone string
|
|
**/
|
|
function tzinfo($zone) {
|
|
$ref=new \DateTimeZone($zone);
|
|
$loc=$ref->getLocation();
|
|
$trn=$ref->getTransitions($now=time(),$now);
|
|
$out=[
|
|
'offset'=>$ref->
|
|
getOffset(new \DateTime('now',new \DateTimeZone('UTC')))/3600,
|
|
'country'=>$loc['country_code'],
|
|
'latitude'=>$loc['latitude'],
|
|
'longitude'=>$loc['longitude'],
|
|
'dst'=>$trn[0]['isdst']
|
|
];
|
|
unset($ref);
|
|
return $out;
|
|
}
|
|
|
|
/**
|
|
* Return geolocation data based on specified/auto-detected IP address
|
|
* @return array|FALSE
|
|
* @param $ip string
|
|
**/
|
|
function location($ip=NULL) {
|
|
$fw=\Base::instance();
|
|
$web=\Web::instance();
|
|
if (!$ip)
|
|
$ip=$fw->IP;
|
|
$public=filter_var($ip,FILTER_VALIDATE_IP,
|
|
FILTER_FLAG_IPV4|FILTER_FLAG_IPV6|
|
|
FILTER_FLAG_NO_RES_RANGE|FILTER_FLAG_NO_PRIV_RANGE);
|
|
if (function_exists('geoip_db_avail') &&
|
|
geoip_db_avail(GEOIP_CITY_EDITION_REV1) &&
|
|
$out=@geoip_record_by_name($ip)) {
|
|
$out['request']=$ip;
|
|
$out['region_code']=$out['region'];
|
|
$out['region_name']='';
|
|
if (!empty($out['country_code']) && !empty($out['region']))
|
|
$out['region_name']=geoip_region_name_by_code(
|
|
$out['country_code'],$out['region']
|
|
);
|
|
unset($out['country_code3'],$out['region'],$out['postal_code']);
|
|
return $out;
|
|
}
|
|
if (($req=$web->request('http://www.geoplugin.net/json.gp'.
|
|
($public?('?ip='.$ip):''))) &&
|
|
$data=json_decode($req['body'],TRUE)) {
|
|
$out=[];
|
|
foreach ($data as $key=>$val)
|
|
if (!strpos($key,'currency') && $key!=='geoplugin_status'
|
|
&& $key!=='geoplugin_region')
|
|
$out[$fw->snakecase(substr($key, 10))]=$val;
|
|
return $out;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
* Return weather data based on specified latitude/longitude
|
|
* @return array|FALSE
|
|
* @param $latitude float
|
|
* @param $longitude float
|
|
* @param $key string
|
|
**/
|
|
function weather($latitude,$longitude,$key) {
|
|
$fw=\Base::instance();
|
|
$web=\Web::instance();
|
|
$query=[
|
|
'lat'=>$latitude,
|
|
'lon'=>$longitude,
|
|
'APPID'=>$key,
|
|
'units'=>'metric'
|
|
];
|
|
return ($req=$web->request(
|
|
'http://api.openweathermap.org/data/2.5/weather?'.
|
|
http_build_query($query)))?
|
|
json_decode($req['body'],TRUE):
|
|
FALSE;
|
|
}
|
|
|
|
}
|
|
|