mirror of
				https://github.com/Mibew/geo-ip-plugin.git
				synced 2025-10-31 02:25:52 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			167 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			4.8 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,
 | |
|             'country_code' => $record->country->isoCode,
 | |
|             'city' => $city,
 | |
|             'latitude' => $record->location->latitude,
 | |
|             'longitude' => $record->location->longitude,
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 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.0';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns plugin's dependencies.
 | |
|      *
 | |
|      * @return type
 | |
|      */
 | |
|     public static function getDependencies()
 | |
|     {
 | |
|         return array();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 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]);
 | |
|     }
 | |
| }
 |