From d8470edee0a8fdc4bf5d46afa34f335f127d575a Mon Sep 17 00:00:00 2001 From: "Buster \"Silver Eagle\" Neece" Date: Fri, 18 Dec 2020 11:04:57 -0600 Subject: [PATCH] Add richer listener user-agent details to the listener report. --- .../Api/Stations/ListenersController.php | 68 ++++++++++++------- src/Entity/Api/Listener.php | 8 +++ templates/stations/reports/listeners.phtml | 10 ++- 3 files changed, 57 insertions(+), 29 deletions(-) diff --git a/src/Controller/Api/Stations/ListenersController.php b/src/Controller/Api/Stations/ListenersController.php index 3b0eea7a7..b6d2b2895 100644 --- a/src/Controller/Api/Stations/ListenersController.php +++ b/src/Controller/Api/Stations/ListenersController.php @@ -133,6 +133,40 @@ class ListenersController $locale = $request->getAttribute('locale'); + /** @var Entity\Api\Listener[] $listeners */ + $listeners = []; + foreach ($listeners_raw as $listener) { + $userAgent = (string)$listener['listener_user_agent']; + $dd = $this->deviceDetector->parse($userAgent); + + if ($dd->isBot()) { + $clientBot = $dd->getBot(); + $clientBotName = $clientBot['name'] ?? 'Unknown Crawler'; + $clientBotType = $clientBot['category'] ?? 'Generic Crawler'; + $client = $clientBotName . ' (' . $clientBotType . ')'; + } else { + $clientInfo = $dd->getClient(); + $clientBrowser = $clientInfo['name'] ?? 'Unknown Browser'; + $clientVersion = $clientInfo['version'] ?? '0.00'; + + $clientOsInfo = $dd->getOs(); + $clientOs = $clientOsInfo['name'] ?? 'Unknown OS'; + + $client = $clientBrowser . ' ' . $clientVersion . ', ' . $clientOs; + } + + $api = new Entity\Api\Listener(); + $api->ip = (string)$listener['listener_ip']; + $api->user_agent = $userAgent; + $api->client = $client; + $api->is_mobile = $dd->isMobile(); + $api->connected_on = (int)$listener['timestamp_start']; + $api->connected_time = Entity\Listener::getListenerSeconds($listener['intervals']); + $api->location = $this->geoLite->getLocationInfo($listener['listener_ip'], $locale); + + $listeners[] = $api; + } + $format = $params['format'] ?? 'json'; if ('csv' === $format) { @@ -141,6 +175,7 @@ class ListenersController 'IP', 'Seconds Connected', 'User Agent', + 'Client', 'Is Mobile', 'Location', 'Country', @@ -149,16 +184,16 @@ class ListenersController ], ]; - foreach ($listeners_raw as $listener) { - $location = $this->geoLite->getLocationInfo($listener['listener_ip'], $locale); - + foreach ($listeners as $listener) { $export_row = [ - (string)$listener['listener_ip'], - Entity\Listener::getListenerSeconds($listener['intervals']), - (string)$listener['listener_user_agent'], - $this->isMobile($listener['listener_user_agent']) ? 'true' : 'false', + $listener->ip, + $listener->connected_time, + $listener->user_agent, + $listener->client, + $listener->is_mobile, ]; + $location = $listener->location; if ('success' === $location['status']) { $export_row[] = $location['region'] . ', ' . $location['country']; $export_row[] = $location['country']; @@ -180,25 +215,6 @@ class ListenersController return $response->renderStringAsFile($csv_file, 'text/csv', $csv_filename); } - $listeners = []; - foreach ($listeners_raw as $listener) { - $api = new Entity\Api\Listener(); - $api->ip = (string)$listener['listener_ip']; - $api->user_agent = (string)$listener['listener_user_agent']; - $api->is_mobile = $this->isMobile($listener['listener_user_agent']); - $api->connected_on = (int)$listener['timestamp_start']; - $api->connected_time = Entity\Listener::getListenerSeconds($listener['intervals']); - $api->location = $this->geoLite->getLocationInfo($listener['listener_ip'], $locale); - - $listeners[] = $api; - } - return $response->withJson($listeners); } - - protected function isMobile(string $userAgent): bool - { - $dd = $this->deviceDetector->parse($userAgent); - return $dd->isMobile(); - } } diff --git a/src/Entity/Api/Listener.php b/src/Entity/Api/Listener.php index a929e7162..ac5d13b91 100644 --- a/src/Entity/Api/Listener.php +++ b/src/Entity/Api/Listener.php @@ -27,6 +27,14 @@ class Listener */ public string $user_agent = ''; + /** + * The listener's client details (extracted from user-agent) + * + * @OA\Property(example="") + * @var string + */ + public string $client = ''; + /** * Whether the user-agent is likely a mobile browser. * diff --git a/templates/stations/reports/listeners.phtml b/templates/stations/reports/listeners.phtml index c697b46ce..063b2df25 100644 --- a/templates/stations/reports/listeners.phtml +++ b/templates/stations/reports/listeners.phtml @@ -22,8 +22,11 @@ $assets
- + @@ -74,7 +77,8 @@ $assets - {{ listener.user_agent }} + {{ listener.user_agent }}
+ {{ listener.client }}