first commit
This commit is contained in:
@@ -0,0 +1,169 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright 2013-2019 Yellow Tree, Siegen, Germany
|
||||
Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
|
||||
|
||||
This program 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
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* maybe TODO:
|
||||
* - warn email when counter is low ?
|
||||
* - change to hostinfo or maxmind if credit is zero?
|
||||
* - exclude spiders?
|
||||
* - error logging
|
||||
*/
|
||||
|
||||
namespace YellowTree\GeoipDetect\DataSources\Precision;
|
||||
|
||||
use YellowTree\GeoipDetect\DataSources\AbstractDataSource;
|
||||
use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
|
||||
|
||||
class PrecisionReader extends \GeoIp2\WebService\Client implements \YellowTree\GeoipDetect\DataSources\ReaderInterface
|
||||
{
|
||||
public function __construct($userId, $licenseKey, $options) {
|
||||
parent::__construct($userId, $licenseKey, array('en'), $options);
|
||||
}
|
||||
|
||||
public function city($ip = 'me') {
|
||||
$method = get_option('geoip-detect-precision_api_type', 'city');
|
||||
|
||||
$ret = null;
|
||||
|
||||
$callback = array($this, $method);
|
||||
if (!is_callable($callback)) {
|
||||
throw new \RuntimeException('Precision API: Unsupported method ' . $method);
|
||||
}
|
||||
|
||||
if ($method == 'city')
|
||||
$ret = parent::city($ip);
|
||||
else
|
||||
$ret = call_user_func_array($callback, array($ip));
|
||||
|
||||
/* Web-API-specific exceptions:
|
||||
} catch (AuthenticationException $e) {
|
||||
} catch (OutOfQueriesException $e) {
|
||||
}
|
||||
*/
|
||||
|
||||
if ($ret) {
|
||||
$credits = $ret->maxmind->queriesRemaining; // This seems to be approximate.
|
||||
update_option('geoip-detect-precision-remaining_credits', $credits);
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public function close() { }
|
||||
}
|
||||
|
||||
class PrecisionDataSource extends AbstractDataSource {
|
||||
|
||||
protected $known_api_types = array(
|
||||
'country' => array('label' => 'Country'),
|
||||
'city' => array('label' => 'City'),
|
||||
'insights' => array('label' => 'Insights'));
|
||||
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function getId() { return 'precision'; }
|
||||
public function getLabel() { return __('Maxmind Precision Web-API', 'geoip-detect'); }
|
||||
|
||||
public function getDescriptionHTML() { return __('<a href="https://www.maxmind.com/en/geoip2-precision-services">Maxmind Precision Services</a>', 'geoip-detect'); }
|
||||
public function getStatusInformationHTML() {
|
||||
$html = '';
|
||||
$html .= sprintf(__('API Type: %s', 'geoip-detect'), ucfirst(get_option('geoip-detect-precision_api_type', 'city'))) . '<br />';
|
||||
|
||||
$remaining = get_option('geoip-detect-precision-remaining_credits');
|
||||
if ($remaining !== false) {
|
||||
$html .= sprintf(__('Remaining Credits: ca. %s', 'geoip-detect'), $remaining) . '<br />';
|
||||
}
|
||||
|
||||
if (!$this->isWorking())
|
||||
$html .= '<div class="geoip_detect_error">' . __('Maxmind Precision only works with a given user id and secret.', 'geoip-detect') . '</div>';
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
public function getParameterHTML() {
|
||||
$user_id = (int) get_option('geoip-detect-precision-user_id');
|
||||
$user_secret = esc_attr(get_option('geoip-detect-precision-user_secret'));
|
||||
$current_api_type = get_option('geoip-detect-precision_api_type');
|
||||
|
||||
$label_user_id = __('User ID:', 'geoip-detect');
|
||||
$label_user_secret = __('License key:', 'geoip-detect');
|
||||
$label_api_type = __('API Type:', 'geoip-detect');
|
||||
|
||||
$html = <<<HTML
|
||||
$label_user_id <input type="text" size="10" name="options_precision[user_id]" value="$user_id" /><br />
|
||||
$label_user_secret <input type="text" autocomplete="off" size="20" name="options_precision[user_secret]" value="$user_secret" /><br />
|
||||
$label_api_type <select name="options_precision[api_type]">
|
||||
HTML;
|
||||
|
||||
foreach ($this->known_api_types as $name => $api_type) {
|
||||
$html .= '<option ';
|
||||
if ($name == $current_api_type)
|
||||
$html .= 'selected="selected" ';
|
||||
$html .= 'value="' . $name . '">' . $api_type['label'] . '</option>';
|
||||
}
|
||||
$html .= '</select>';
|
||||
return $html;
|
||||
}
|
||||
|
||||
public function saveParameters($post) {
|
||||
$message = '';
|
||||
|
||||
if (isset($post['options_precision']['user_id'])) {
|
||||
$user_id = (int) $post['options_precision']['user_id'];
|
||||
update_option('geoip-detect-precision-user_id', $user_id);
|
||||
}
|
||||
if (isset($post['options_precision']['user_secret'])) {
|
||||
$user_secret = trim($post['options_precision']['user_secret']);
|
||||
update_option('geoip-detect-precision-user_secret', $user_secret);
|
||||
}
|
||||
if (isset($post['options_precision']['api_type'])) {
|
||||
if (isset($this->known_api_types[$post['options_precision']['api_type']]))
|
||||
update_option('geoip-detect-precision_api_type', $post['options_precision']['api_type']);
|
||||
}
|
||||
|
||||
if (geoip_detect2_is_source_active('precision') && !$this->isWorking())
|
||||
$message .= __('Maxmind Precision only works with a given user id and secret.', 'geoip-detect');
|
||||
|
||||
return $message;
|
||||
}
|
||||
|
||||
public function getReader($locales = array('en'), $options = array()) {
|
||||
if (!$this->isWorking())
|
||||
return null;
|
||||
|
||||
$user_id = get_option('geoip-detect-precision-user_id');
|
||||
$user_secret = get_option('geoip-detect-precision-user_secret');
|
||||
|
||||
$client = new PrecisionReader($user_id, $user_secret, $options);
|
||||
|
||||
return $client;
|
||||
}
|
||||
|
||||
public function isWorking() {
|
||||
$user_id = get_option('geoip-detect-precision-user_id');
|
||||
$user_secret = get_option('geoip-detect-precision-user_secret');
|
||||
|
||||
return ! (empty($user_id) || empty($user_secret));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
geoip_detect2_register_source(new PrecisionDataSource());
|
||||
Reference in New Issue
Block a user