| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Plugins\AnonymousPiwikUsageMeasurement; |
|
|
| use Piwik\Common; |
| use Piwik\Container\StaticContainer; |
| use Piwik\Date; |
| use Piwik\Piwik; |
| use Piwik\Plugins\AnonymousPiwikUsageMeasurement\Tracker\Profiles; |
|
|
| class AnonymousPiwikUsageMeasurement extends \Piwik\Plugin |
| { |
| public const TRACKING_DOMAIN = 'https://demo-anonymous.matomo.org'; |
| public const EXAMPLE_DOMAIN = 'http://example.com'; |
|
|
| private $profilingStack = array(); |
|
|
| |
| |
| |
| public function registerEvents() |
| { |
| return array( |
| 'AssetManager.getJavaScriptFiles' => 'getJsFiles', |
| 'Template.jsGlobalVariables' => 'addMatomoClientTracking', |
| 'API.Request.dispatch' => 'logStartTimeOfApiCall', |
| 'API.Request.dispatch.end' => 'trackApiCall', |
| 'Db.getTablesInstalled' => 'getTablesInstalled' |
| ); |
| } |
|
|
| public function install() |
| { |
| $dao = new Profiles(); |
| $dao->install(); |
| } |
|
|
| public function uninstall() |
| { |
| $dao = new Profiles(); |
| $dao->uninstall(); |
| } |
|
|
| |
| |
| |
| |
| |
| public function getTablesInstalled(&$allTablesInstalled) |
| { |
| $allTablesInstalled[] = Common::prefixTable('usage_measurement_profiles'); |
| } |
|
|
| public function logStartTimeOfApiCall(&$finalParameters, $pluginName, $methodName) |
| { |
| |
| $this->profilingStack[] = array( |
| 'method' => $pluginName . '.' . $methodName, |
| 'time' => microtime(true) |
| ); |
| } |
|
|
| public function trackApiCall(&$return, $endHookParams) |
| { |
| $endTime = microtime(true); |
|
|
| $name = $endHookParams['module']; |
| $method = $name . '.' . $endHookParams['action']; |
| $neededTimeInMs = 0; |
|
|
| do { |
| $call = array_pop($this->profilingStack); |
|
|
| |
| if ($method === $call['method']) { |
| $neededTimeInMs = ceil(($endTime - $call['time']) * 1000); |
| break; |
| } |
| } while (!empty($this->profilingStack)); |
|
|
| if (empty($neededTimeInMs)) { |
| return; |
| } |
|
|
| $profiles = StaticContainer::get('Piwik\Plugins\AnonymousPiwikUsageMeasurement\Tracker\Profiles'); |
|
|
| $now = Date::now()->getDatetime(); |
| $category = 'API'; |
|
|
| $profiles->pushProfile($now, $category, $name, $method, $count = 1, (int) $neededTimeInMs); |
| } |
|
|
| public function getJsFiles(&$jsFiles) |
| { |
| $jsFiles[] = 'matomo.js'; |
| $jsFiles[] = 'plugins/AnonymousPiwikUsageMeasurement/javascripts/url.js'; |
| $jsFiles[] = 'plugins/AnonymousPiwikUsageMeasurement/javascripts/tracking.js'; |
| } |
|
|
| public function addMatomoClientTracking(&$out) |
| { |
| $settings = StaticContainer::get(SystemSettings::class); |
| $userSettings = StaticContainer::get(UserSettings::class); |
|
|
| $config = array( |
| 'targets' => array(), |
| 'visitorCustomVariables' => array(), |
| 'trackingDomain' => self::TRACKING_DOMAIN, |
| 'exampleDomain' => self::EXAMPLE_DOMAIN, |
| 'userId' => Piwik::getCurrentUserLogin() |
| ); |
|
|
| if ( |
| Piwik::isUserIsAnonymous() |
| || !$settings->canUserOptOut->getValue() |
| || $userSettings->userTrackingEnabled->getValue() |
| ) { |
| |
| |
| |
| |
| |
| $targets = StaticContainer::get('Piwik\Plugins\AnonymousPiwikUsageMeasurement\Tracker\Targets'); |
| $customVars = StaticContainer::get('Piwik\Plugins\AnonymousPiwikUsageMeasurement\Tracker\CustomVariables'); |
|
|
| $config['targets'] = $targets->getTargets(); |
| $config['visitorCustomVariables'] = $customVars->getClientVisitCustomVariables(); |
| } |
|
|
| $out .= "\nvar piwikUsageTracking = " . json_encode($config) . ";\n"; |
| } |
| } |
|
|