💾 Archived View for code.lanterne.chilliet.eu › vendor › mcmic › gemini-server › src › Statistics › … captured on 2021-12-17 at 13:26:06.

View Raw

More Information

-=-=-=-=-=-=-

<?php

declare(strict_types=1);

namespace MCMic\Gemini\Statistics;

class Container
{
    /**
     * @var array<string,int>
     */
    public $visits = [];
    /**
     * @var array<string,int>
     */
    public $pageviews = [];
    /**
     * @var array<string,array<string,int>>
     */
    public $errors = [];
    /**
     * @var ?\Datetime
     */
    public $date = null;

    public function __construct(?string $date = null)
    {
        if ($date !== null) {
            $this->date = new \DateTime($date);
        }
    }

    /**
     * @param array<string> $data
     */
    public function append(array $data): bool
    {
        [$date, $id, $request, $status, $meta] = $data;
        if (isset($this->date)) {
            $date = new \DateTime($date);
            if ($date < $this->date) {
                return false;
            }
        }
        if (!isset($this->visits[$id])) {
            $this->visits[$id] = 0;
        }
        $this->visits[$id]++;
        if ($status == 20) {
            if (!isset($this->pageviews[$request])) {
                $this->pageviews[$request] = 0;
            }
            $this->pageviews[$request]++;
        } elseif ($status >= 40) {
            if (!isset($this->errors[$request][$status . ' ' . $meta])) {
                $this->errors[$request][$status . ' ' . $meta] = 0;
            }
            $this->errors[$request][$status . ' ' . $meta]++;
        }
        return true;
    }

    public function isEmpty(): bool
    {
        return (count($this->visits) + count($this->pageviews) + count($this->errors) === 0);
    }

    public function render(): string
    {
        $output = '## Visits' . "\r\n";
        $output .= count($this->visits) . ' unique visitors' . "\r\n";
        $output .= array_sum($this->pageviews) . ' page hits' . "\r\n";

        if (count($this->pageviews) > 0) {
            arsort($this->pageviews);
            reset($this->pageviews);
            for ($i = 0; $i <= 10; $i++) {
                $output .= '* ' . key($this->pageviews) . ': ' . current($this->pageviews) . "\r\n";
                if (next($this->pageviews) === false) {
                    break;
                }
            }
        }

        $output .= '## Errors' . "\r\n";
        $output .= array_sum(array_map('array_sum', $this->errors)) . ' errors' . "\r\n";
        if (count($this->errors) > 0) {
            uasort(
                $this->errors,
                function ($a, $b): int {
                    return array_sum($b) <=> array_sum($a);
                }
            );
            reset($this->errors);
            for ($i = 0; $i <= 5; $i++) {
                $output .= key($this->errors) . ': ' . array_sum(current($this->errors)) . "\r\n";
                foreach (current($this->errors) as $error => $count) {
                    $output .= '* ' . $error . ': ' . $count . "\r\n";
                }
                if (next($this->errors) === false) {
                    break;
                }
            }
        }
        return $output;
    }

    /**
     * @return array<string,Container>
     */
    public static function computeData(string $path): array
    {
        $containers = [
            'Today' => new Container('today'),
            'Last 7 days' => new Container('7 days ago'),
            'This month' => new Container('first day of this month'),
            'Total' => new Container(),
        ];

        if (($handle = fopen($path, 'r')) !== false) {
            while (($data = fgetcsv($handle, 2000, ',')) !== false) {
                foreach ($containers as $container) {
                    $container->append($data);
                }
            }
            fclose($handle);
        }
        return $containers;
    }
}