1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
declare(strict_types=1);
namespace Piwik\Plugins\BotTracking;
use Piwik\Date;
use Piwik\Period;
use Piwik\Site;
use Piwik\Plugins\BotTracking\BotDetector;
use Piwik\Plugins\BotTracking\Dao\BotRequestsDao;
class NoRecentRequestsMessage
{
public static function shouldShow(int $idSite, string $period, string $date): bool
{
if ($idSite <= 0 || $period === '' || $date === '') {
return false;
}
try {
$selected = Period\Factory::build($period, $date);
} catch (\Exception $e) {
return false;
}
$siteTimezone = Site::getTimezoneFor($idSite);
$todayLocal = Date::factoryInTimezone('today', $siteTimezone)
->setTimezone($siteTimezone);
$last7Start = $todayLocal->subDay(6);
$last7End = $todayLocal->getEndOfDay();
$selectedStart = $selected->getDateStart()->setTimezone($siteTimezone);
$selectedEnd = $selected->getDateEnd()->getEndOfDay()->setTimezone($siteTimezone);
$overlapsLast7 = !$selectedEnd->isEarlier($last7Start)
&& !$selectedStart->isLater($last7End);
if (!$overlapsLast7) {
return false;
}
// server_time is stored in UTC and is indexed with idsite, so querying the latest value is fast.
$lastRequest = (new BotRequestsDao())->getLastServerTimeForSiteAndBotType(
$idSite,
BotDetector::BOT_TYPE_AI_CHATBOT
);
if (empty($lastRequest)) {
return true;
}
// Date::factory interprets the stored UTC string, so comparison is done in UTC timestamps.
return Date::factory($lastRequest)->isEarlier($last7Start);
}
}
|