| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| declare(strict_types=1); |
|
|
| namespace Piwik\Plugins\BotTracking; |
|
|
| use Piwik\Date; |
| use Piwik\Piwik; |
| use Piwik\Plugin; |
| use Piwik\Plugins\BotTracking\Dao\BotRequestsDao; |
| use Piwik\Plugins\SitesManager\API; |
| use Piwik\Plugins\BotTracking\Metrics as BotMetrics; |
| use Piwik\Plugins\BotTracking\Reports\AIChatbotsRealTimeWidgets; |
| use Piwik\Tracker\Request; |
|
|
| |
| |
| |
| |
| |
| |
| |
| class BotTracking extends Plugin |
| { |
| |
| |
| |
| public function isTrackerPlugin() |
| { |
| return true; |
| } |
|
|
| |
| |
| |
| public function registerEvents(): array |
| { |
| return [ |
| 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles', |
| 'PrivacyManager.deleteLogsOlderThan' => 'deleteLogsOlderThan', |
| 'PrivacyManager.deleteDataSubjectsForDeletedSites' => 'deleteDataSubjectsForDeletedSites', |
| 'Tracker.isBotRequest' => 'isBotRequest', |
| 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys', |
| 'Metrics.getEvolutionUnit' => 'getEvolutionUnit', |
| 'Metrics.getDefaultMetricTranslations' => 'addMetricTranslations', |
| 'Metrics.getDefaultMetricDocumentationTranslations' => 'addMetricDocumentationTranslations', |
| 'Metrics.getDefaultMetricSemanticTypes' => 'addMetricSemanticTypes', |
| 'API.addGlossaryItems' => 'addGlossaryItems', |
| ]; |
| } |
|
|
| |
| |
| |
| public function install() |
| { |
| (new BotRequestsDao())->createTable(); |
| } |
|
|
| |
| |
| |
| public function uninstall() |
| { |
| (new BotRequestsDao())->dropTable(); |
| } |
|
|
| public function deleteLogsOlderThan(Date $dateUpperLimit): void |
| { |
| (new BotRequestsDao())->deleteOldRecords($dateUpperLimit); |
| } |
|
|
| |
| |
| |
| public function deleteDataSubjectsForDeletedSites(array &$result): void |
| { |
| $allExistingIdSites = API::getInstance()->getAllSitesId(); |
| $allExistingIdSites = array_map('intval', $allExistingIdSites); |
| $maxIdSite = max($allExistingIdSites); |
|
|
| if (empty($maxIdSite)) { |
| return; |
| } |
|
|
| $dao = new BotRequestsDao(); |
| $idSitesInTable = $dao->getDistinctIdSitesInTable($maxIdSite); |
| $idSitesNoLongerExisting = array_diff($idSitesInTable, $allExistingIdSites); |
|
|
| if (count($idSitesNoLongerExisting) > 0) { |
| $result[$dao::getTableName()] = $dao->deleteRecordsForIdSites($idSitesNoLongerExisting); |
| } |
| } |
|
|
| |
| |
| |
| public function isBotRequest(bool &$isBot, Request $request): void |
| { |
| $botDetector = new BotDetector($request->getUserAgent()); |
|
|
| if ($botDetector->isBot()) { |
| $isBot = true; |
| } |
| } |
|
|
| public function getEvolutionUnit(?string &$unit, string $column): void |
| { |
| if ($column === Metrics::METRIC_AI_CHATBOTS_CLICK_THROUGH_RATE) { |
| $unit = '%'; |
| } |
| } |
|
|
| |
| |
| |
| public function addMetricTranslations(array &$translations): void |
| { |
| $translations = array_merge($translations, BotMetrics::getMetricTranslations()); |
|
|
| |
| |
| |
| |
| |
| if (!isset($translations[Metrics::COLUMN_REQUESTS])) { |
| $translations[Metrics::COLUMN_REQUESTS] = Piwik::translate('BotTracking_ColumnRequests'); |
| } |
| } |
|
|
| |
| |
| |
| public function addMetricDocumentationTranslations(array &$translations): void |
| { |
| $translations = array_merge($translations, BotMetrics::getMetricDocumentation()); |
|
|
| |
| |
| |
| |
| |
| |
| if (!isset($translations[Metrics::COLUMN_REQUESTS])) { |
| $translations[Metrics::COLUMN_REQUESTS] = Piwik::translate('BotTracking_ColumnRequestsDocumentation'); |
| } |
| } |
|
|
| |
| |
| |
| public function addMetricSemanticTypes(array &$types): void |
| { |
| $types = array_merge($types, BotMetrics::getMetricSemanticTypes()); |
| } |
|
|
| |
| |
| |
| public function addGlossaryItems(array &$glossaryItems): void |
| { |
| Piwik::checkUserHasSomeViewAccess(); |
|
|
| $category = Piwik::translate('General_AIAssistants'); |
|
|
| foreach (AIChatbotsRealTimeWidgets::getAllWidgets() as $widget) { |
| $glossaryItems['reports']['entries'][] = [ |
| 'name' => sprintf('%s (%s)', Piwik::translate($widget['name']), $category), |
| 'documentation' => Piwik::translate($widget['documentation']), |
| ]; |
| } |
| } |
|
|
| |
| |
| |
| |
| public function getClientSideTranslationKeys(&$translationKeys) |
| { |
| $translationKeys[] = 'BotTracking_DetectingYourSite'; |
| $translationKeys[] = 'BotTracking_SiteWithoutDataBackToMatomo'; |
| $translationKeys[] = 'BotTracking_SiteWithoutDataChooseTrackingMethod'; |
| $translationKeys[] = 'BotTracking_SiteWithoutDataChooseTrackingMethodPreamble1'; |
| $translationKeys[] = 'BotTracking_SiteWithoutDataChooseTrackingMethodPreamble2'; |
| $translationKeys[] = 'BotTracking_SiteWithoutDataInstallWithX'; |
| $translationKeys[] = 'BotTracking_SiteWithoutDataNotYetReady'; |
| $translationKeys[] = 'BotTracking_SiteWithoutDataOtherInstallMethods'; |
| $translationKeys[] = 'BotTracking_SiteWithoutDataOtherInstallMethodsIntro'; |
| $translationKeys[] = 'BotTracking_SiteWithoutDataInstallWithXRecommendation'; |
| $translationKeys[] = 'BotTracking_SiteWithoutDataRecommendationText'; |
| $translationKeys[] = 'General_ErrorRequest'; |
| $translationKeys[] = 'General_Refresh'; |
| $translationKeys[] = 'Mobile_NavigationBack'; |
| $translationKeys[] = 'BotTracking_NoRecentAIBotRequests'; |
| } |
|
|
| |
| |
| |
| |
| public function getStylesheetFiles(&$stylesheets) |
| { |
| $stylesheets[] = "plugins/BotTracking/stylesheets/BotTracking.less"; |
| } |
| } |
|
|