geo-ip-plugin/Plugin.php
2018-09-24 17:04:45 +03:00

182 lines
5.2 KiB
PHP

<?php
/*
* This file is a part of Mibew GeoIp Plugin.
*
* Copyright 2014 Dmitriy Simushev <simushevds@gmail.com>.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file The main file of Mibew:GeoIp plugin.
*/
namespace Mibew\Mibew\Plugin\GeoIp;
use GeoIp2\Database\Reader as GeoIpReader;
/**
* This plugin provides an API for GeoIP information.
*/
class Plugin extends \Mibew\Plugin\AbstractPlugin implements \Mibew\Plugin\PluginInterface
{
/**
* Class construct.
*
* @param array $config Configurations array.
*/
public function __construct($config)
{
$config += array(
'database_path' => $this->getFilesPath() . '/db/GeoIP.mmdb',
);
parent::__construct($config);
// Use autoloader for Composer's packages that shipped with the plugin
require(__DIR__ . '/vendor/autoload.php');
}
/**
* The plugin does not need extra initialization thus it is always ready to
* work.
*
* @return boolean
*/
public function initialized()
{
return true;
}
/**
* Retrieves Geo Info by IP.
*
* @param string $ip IP address
* @param string $locale Locale name which should be used for country and
* city names. If this argument is ommited default names in english will
* be used.
* @return array Associative array of Geo information. It has the following
* keys:
* - "country_name": Name of the country the IP is situated in.
* - "country_code": ISO 3166-1 Alpha-2 code the IP is situated in.
* - "city": Name of the city the IP is situated in.
* - "latitude": Latitude of the place the IP is situated in.
* - "longitude": Longitude of the place the IP is situated in.
*/
public function getGeoInfo($ip, $locale = false)
{
try {
$reader = new GeoIpReader($this->config['database_path']);
$record = $reader->city($ip);
} catch (\GeoIp2\Exception\AddressNotFoundException $e) {
return array(
'country_name' => 'Unknown',
'country_code' => false,
'city' => 'Unknown',
'latitude' => 0,
'longitude' => 0,
);
}
if ($locale) {
// Make sure the locale in "xx-XX" format.
$locale = $this->formatLocale($locale);
}
// Try to use localized names for country and city. If there are no such
// names use english ones.
$country_name = $locale && isset($record->country->names[$locale])
? $record->country->names[$locale]
: $record->country->name;
$city = $locale && isset($record->city->names[$locale])
? $record->city->names[$locale]
: $record->city->name;
return array(
'country_name' => $country_name ?: 'Unknown',
'country_code' => $record->country->isoCode ?: false,
'city' => $city ?: 'Unknown',
'latitude' => $record->location->latitude ?: 0,
'longitude' => $record->location->longitude ?: 0,
);
}
/**
* This method is intentionally empty but should exist to let the plugin
* implements {@link \Mibew\Plugin\PluginInterface}.
*/
public function run()
{
}
/**
* Returns pluing's version.
*
* @return string
*/
public static function getVersion()
{
return '1.0.2';
}
/**
* Returns plugin's dependencies.
*
* @return type
*/
public static function getDependencies()
{
return array();
}
/**
* Returns plugin's system requirements
*
* @return type
*/
public static function getSystemRequirements()
{
if (extension_loaded('gmp')) {
return array('ext-gmp' => '*');
}
else {
return array('ext-bcmath' => '*');
}
}
/**
* Format locale name using "xx-XX" format.
*
* @param string $locale Original locale name in format it is used in Mibew.
* @return string|false Formatted locale name or boolean false if the
* original locale name is not correct.
*/
protected function formatLocale($locale)
{
// Make sure the original locale name is correct
if (!locale_pattern_check($locale)) {
return false;
}
$parts = explode('-', $locale);
if (count($parts) == 1) {
// The locale is just in "xx" format. There is no need to modify it.
return $parts[0];
}
// Make sure the locale in "xx-XX" format.
return $parts[0] . '-' . strtoupper($parts[1]);
}
}