Skip to content
Snippets Groups Projects
Analytics.php 4.25 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php namespace App\Controllers;
    /**
     * Class Analytics
     * Creates Analytics controller
     * @copyright  2020 Podlibre
     * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
     * @link       https://castopod.org/
     */
    
    use CodeIgniter\Controller;
    
    class Analytics extends Controller
    {
        function __construct()
        {
            $session = \Config\Services::session();
            $session->start();
            $db = \Config\Database::connect();
            $country = 'N/A';
    
            // Finds country:
            if (!$session->has('country')) {
                try {
                    $reader = new \GeoIp2\Database\Reader(
                        WRITEPATH . 'uploads/GeoLite2-Country/GeoLite2-Country.mmdb'
                    );
                    $geoip = $reader->country($_SERVER['REMOTE_ADDR']);
                    $country = $geoip->country->isoCode;
                } catch (\Exception $e) {
                    // If things go wrong the show must go on and the user must be able to download the file
                }
                $session->set('country', $country);
            }
    
            // Finds player:
            if (!$session->has('player')) {
                $playerName = '-unknown-';
                $error = '';
    
                try {
                    $useragent = $_SERVER['HTTP_USER_AGENT'];
                    $jsonUserAgents = json_decode(
                        file_get_contents(
                            WRITEPATH . 'uploads/user-agents/src/user-agents.json'
                        ),
                        true
                    );
    
                    //Search for current HTTP_USER_AGENT in json file:
                    foreach ($jsonUserAgents as $player) {
                        foreach ($player['user_agents'] as $useragentsRegexp) {
                            //Does the HTTP_USER_AGENT match this regexp:
                            if (preg_match("#{$useragentsRegexp}#", $useragent)) {
                                if (isset($player['bot'])) {
                                    //It’s a bot!
                                    $playerName = '-bot-';
                                } else {
                                    //It isn’t a bot, we store device/os/app:
                                    $playerName =
                                        (isset($player['device'])
                                            ? $player['device'] . '/'
                                            : '') .
                                        (isset($player['os'])
                                            ? $player['os'] . '/'
                                            : '') .
                                        (isset($player['app'])
                                            ? $player['app']
                                            : '?');
                                }
                                //We found it!
                                break 2;
                            }
                        }
                    }
                } catch (\Exception $e) {
                    // If things go wrong the show must go on and the user must be able to download the file
                }
                if ($playerName == '-unknown-') {
                    // Add to unknown list
                    try {
                        $procedureNameAUU = $db->prefixTable(
                            'analytics_unknown_useragents'
                        );
                        $db->query("CALL $procedureNameAUU(?)", [$useragent]);
                    } catch (\Exception $e) {
                        // If things go wrong the show must go on and the user must be able to download the file
                    }
                }
                $session->set('player', $playerName);
            }
        }
    
        // Add one hit to this episode:
        public function hit($p_podcast_id, $p_episode_id, ...$filename)
        {
            $session = \Config\Services::session();
            $db = \Config\Database::connect();
            $procedureName = $db->prefixTable('analytics_podcasts');
            $p_country_code = $session->get('country');
            $p_player = $session->get('player');
            try {
                $db->query("CALL $procedureName(?,?,?,?);", [
                    $p_podcast_id,
                    $p_episode_id,
                    $p_country_code,
                    $p_player,
                ]);
            } catch (\Exception $e) {
                // If things go wrong the show must go on and the user must be able to download the file
            }
            return redirect()->to(media_url(implode('/', $filename)));
        }
    }