includes/dashboard/global.php

<?php
declare(strict_types=1);

/*
|--------------------------------------------------------------------------
| Global
|--------------------------------------------------------------------------
*/

$global = [];

$globalTotal = [
    'unique_visitors' => (int)($totalSqlite['unique_visitors'] ?? 0) + (int)($archivesTotal['unique_visitors'] ?? 0),
    'visits' => (int)($totalSqlite['visits'] ?? 0) + (int)($archivesTotal['visits'] ?? 0),
    'pageviews' => (int)($totalSqlite['pageviews'] ?? 0) + (int)($archivesTotal['pageviews'] ?? 0),
    'bots' => (int)($totalSqlite['bots'] ?? 0) + (int)($archivesTotal['bots'] ?? 0),
];

$globalCountries = [];

if ($showCountries) {
    $globalCountriesRaw = fetchAll($db, '
        SELECT country, SUM(views) AS views
        FROM countries_daily
        GROUP BY country
        ORDER BY views DESC
    ');

    foreach ($globalCountriesRaw as $row) {
        $country = (string)($row['country'] ?? '');

        if ($country === '') {
            continue;
        }

        $globalCountries[$country] = [
            'country' => $country,
            'views' => (int)($row['views'] ?? 0),
        ];
    }

    foreach (archiveGroupedViews('countries', 'country') as $row) {
        $country = (string)($row['country'] ?? '');

        if ($country === '') {
            continue;
        }

        $globalCountries[$country] ??= [
            'country' => $country,
            'views' => 0,
        ];

        $globalCountries[$country]['views'] += (int)($row['views'] ?? 0);
    }

    $globalCountries = array_values($globalCountries);

    usort($globalCountries, fn($a, $b) => $b['views'] <=> $a['views']);

    $globalTotal['countries'] = count($globalCountries);
}

$globalReferrersRaw = fetchAll($db, '
    SELECT referrer, SUM(views) AS views
    FROM referrers_daily
    GROUP BY referrer
    ORDER BY views DESC
');

foreach (archiveGroupedViews('referrers', 'referrer') as $row) {
    $globalReferrersRaw[] = $row;
}

$globalSearchEnginesGrouped = [];
$globalReferrersGrouped = [];

foreach ($globalReferrersRaw as $row) {
    $referrer = (string)($row['referrer'] ?? '');

    if ($referrer === '') {
        continue;
    }

    $realCategory = referrerCategory($referrer);

    if (
        referrerBlocked($referrer) ||
        $realCategory === BRIVACIA_CATEGORY_BLOCKED
    ) {
        $canonical = BRIVACIA_BLOCKED;
        $label = t('ui.blocked');
        $category = BRIVACIA_CATEGORY_BLOCKED;
    } elseif (strcasecmp($referrer, BRIVACIA_UNKNOWN) === 0) {
        $canonical = BRIVACIA_UNKNOWN;
        $label = t('ui.unknown');
        $category = BRIVACIA_CATEGORY_REFERRER;
    } else {
        $canonical = referrerCanonical($referrer);
        $label = referrerLabel($referrer);
        $category = $realCategory;
    }

    if ($category === BRIVACIA_CATEGORY_SEARCH) {
        $target =& $globalSearchEnginesGrouped;
    } else {
        $target =& $globalReferrersGrouped;
    }

    if (!isset($target[$canonical])) {
        $target[$canonical] = [
            'referrer' => $canonical,
            'label' => $label,
            'category' => $category,
            'views' => 0,
        ];
    }

    $target[$canonical]['views'] += (int)($row['views'] ?? 0);

    unset($target);
}

$globalSearchEngines = array_values($globalSearchEnginesGrouped);
$globalReferrers = array_values($globalReferrersGrouped);

usort($globalSearchEngines, fn($a, $b) => $b['views'] <=> $a['views']);
usort($globalReferrers, fn($a, $b) => $b['views'] <=> $a['views']);

$globalTotal['search_engines'] = count($globalSearchEngines);
$globalTotal['referrers'] = count($globalReferrers);