b0y-101 Mini Shell


Current Path : E:/www/plan/administrator/components/com_coalawebtraffic/helpers/
File Upload :
Current File : E:/www/plan/administrator/components/com_coalawebtraffic/helpers/location.php

<?php

/**
 * @package     Joomla
 * @subpackage  CoalaWeb Traffic
 * @author      Steven Palmer <support@coalaweb.com>
 * @link        https://coalaweb.com/
 * @license     GNU/GPL V3 or later; https://www.gnu.org/licenses/gpl-3.0.html
 * @copyright   Copyright (c) 2020 Steven Palmer All rights reserved.
 *
 * CoalaWeb Traffic 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.
 */

defined('_JEXEC') or die('Restricted access');

jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.path');

$path = JPATH_ADMINISTRATOR . '/components/com_coalawebtraffic/assets/geoip/v2/Db';

if (!class_exists('\MaxMind\Db\Reader') && JFolder::exists($path)){
    require_once $path .  '/Reader.php';
    require_once $path .  '/Reader/Decoder.php';
    require_once $path .  '/Reader/InvalidDatabaseException.php';
    require_once $path .  '/Reader/Metadata.php';
    require_once $path .  '/Reader/Util.php';
}

use MaxMind\Db\Reader;


/**
 *  CoalaWeb Traffic component helper.
 */
class CoalawebtrafficHelperLocation
{
      /**
     * Update Visitor info V2 to include country, city, continent, longitude and latitude
     * 
     * @return void
     */
    public static function location_updatev2()
    {
        $db = JFactory::getDbo();

        $query = $db->getQuery(true);
        $query->select('id, ip');
        $query->from($db->quoteName('#__cwtraffic'));
        $query->where('country_code = "" OR country_code is null');
        $db->setQuery($query);

        try {
            // If it fails, it will throw a RuntimeException
            $result = $db->loadObjectList();
        } catch (JDatabaseExceptionExecuting $e) {
            return false;
        }

        foreach ($db->loadObjectList() as $row) {
            $geo = self::geoInfo($row->ip);

            $country_code = $geo['country_code'];
            $country_name = $geo['country_name'];
            $city = $geo['city'];

                    if ($country_code != '' && $country_name != '') {

                        $query = $db->getQuery(true);
                        $query->update('#__cwtraffic');
                        $query->set('country_code = ' . $db->quote($country_code));
                        $query->set('country_name = ' . $db->quote($country_name));
                        $query->set('city = ' . $db->quote($city));
                        $query->where('id = ' . $row->id);
                        $db->setQuery($query);
                        
                        try {
                            $db->execute();
                        } catch (Exception $exc) {
                            // Nothing
                        }
                    }
                }


                $query = $db->getQuery(true);
                $query->update('#__cwtraffic');
                $query->set('city = NULL');
                $query->where('city = ""');
                $db->setQuery($query);
                
                try {
                    $db->execute();
                } catch (JDatabaseExceptionExecuting $e) {
                    return false;
                }


        return true;
    }
    
    /**
     * Checks if GeoLiteCity.dat file exists
     *
     * @param  $geo
     * @return bool
     */
    public static function geodatExist()
    {
        self::renamedb();

        $path = JPATH_ADMINISTRATOR . '/components/com_coalawebtraffic/assets/geoip/v2';
        if (JFolder::files($path, 'GeoLite2-City.mmdb', false)) {
            return true;
        }

        return false;
    }

    /**
     * Returns modified date for file
     *
     * @param  $geo
     * @param $v
     * @return false|string $mod
     */
    public static function geodatMod()
    {
        $path = JPATH_ADMINISTRATOR . '/components/com_coalawebtraffic/assets/geoip/v2';
        $mod = date("d m Y", filemtime($path . '/GeoLite2-City.mmdb'));

        return $mod;
    }

    /**
     * Read GEO info
     *
     * @param $ip
     * @return array
     */
    public static function geoInfo($ip) {

        $mmdbLocation = JPATH_ADMINISTRATOR . '/components/com_coalawebtraffic/assets/geoip/v2/GeoLite2-City.mmdb';

        try {
            $cwreader = new Reader($mmdbLocation);
        }
        // If anything goes wrong, MaxMind will raise an exception.
        catch (\Exception $e) {
            $cwreader = null;
        }

        try {
            if (!is_null($cwreader)) {
                $lookup = $cwreader->get($ip);
            } else {
                $lookup = null;
            }
        } catch (\GeoIp2\Exception\AddressNotFoundException $e) {
            $lookup = false;
        } catch (\MaxMind\Db\Reader\InvalidDatabaseException $e) {
            $lookup = null;
        }
        // GeoIp2 could throw several different types of exceptions. Let's be sure that we're going to catch them all
        catch (Exception $e) {
            $lookup = null;
        }


        if(!is_null($lookup) || $lookup != false){
            $country_code = isset($lookup['country']['iso_code']) ? strtolower($lookup['country']['iso_code']) : NULL;
            $country_name = isset($lookup['country']['names']['en']) ? $lookup['country']['names']['en'] : NULL;
            $city = isset($lookup['city']) ? $lookup['city']['names']['en'] : NULL;
        } else {
            $country_code = NULL;
            $country_name = NULL;
            $city = NULL;
        }

        return array(
            'country_code' => $country_code,
            'country_name' => $country_name,
            'city' => $city
        );

    }

    /**
     * Function to rename old lowercase GEO DB files
     */
    private static function renamedb() {

        //Rename Pro GEO DB
        $path = JPATH_ADMINISTRATOR . '/components/com_coalawebtraffic/assets/geoip/v2';
        $old = 'geolite2-city.mmdb';
        $new = 'GeoLite2-City.mmdb';

        if (JFolder::files($path, $old, false)) {
            try {
                rename($path . '/' . $old, $path . '/' . $new);
            } catch (Exception $exc) {
                // Nothing
            }
        }
    }

}

Copyright © 2019 by b0y-101