v1.6.28 : drill-down IP par AS dans stats pays, suppression Répartition par réseau

- Admin stats : clic sur un réseau AS affiche les IPs avec mini sparkline 14 jours + articles/livres consultés
- AccessLogParser : calcul ip_data (daily + top paths) inclus dans le cache stats
- Suppression du tableau statique "Répartition par réseau" (fusionné dans accordéon pays)
- PHP-CS-Fixer appliqué sur l'ensemble des fichiers modifiés

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-19 19:59:44 +02:00
parent d6a7033e9e
commit 40656631ba
23 changed files with 248 additions and 174 deletions
+15
View File
@@ -2738,11 +2738,25 @@ switch ($action) {
$topIps = array_slice($accessStats['ips'], 0, 200, true);
$asnMap = (new AsnLookup())->batchLookup(array_keys($topIps));
$ipData = [];
foreach ($accessStats['ips_by_day'] ?? [] as $ip => $daily) {
$info = $asnMap[$ip] ?? ['asn' => '', 'name' => '?', 'country' => ''];
$ipData[$ip] = [
'hits' => $topIps[$ip] ?? (int) array_sum($daily),
'asn' => $info['asn'],
'name' => $info['name'],
'country' => $info['country'],
'daily' => $daily,
'paths' => $accessStats['ip_top_paths'][$ip] ?? [],
];
}
$statsRaw = [
'readable' => $accessParser->isReadable(),
'books' => $tParser->top($cutoff14, 20, ['/book/']),
'as' => AsnLookup::aggregateByAs($topIps, $asnMap),
'pages_by_day' => $accessStats['pages_by_day'] ?? [],
'ip_data' => $ipData,
];
@file_put_contents($statsCacheFile, json_encode($statsRaw));
}
@@ -2752,6 +2766,7 @@ switch ($action) {
$adminData['stats_as_groups'] = AsnLookup::applyGroups($statsRaw['as'], asGroups());
$adminData['as_groups'] = asGroups();
$adminData['stats_pages_by_day'] = $statsRaw['pages_by_day'] ?? [];
$adminData['stats_ip_data'] = $statsRaw['ip_data'] ?? [];
}
if ($tab === 'categories') {