includes/modules/update.php

<?php
declare(strict_types=1);

const BRIVACIA_UPDATE_JSON = 'https://breat.fr/static/json/brivacia-version.json';

function brivaciaUpdateManifest(): array {
    $json = @file_get_contents(
        BRIVACIA_UPDATE_JSON . '?t=' . time(),
        false,
        stream_context_create([
            'http' => [
                'timeout' => 3,
                'ignore_errors' => true,
                'header' => "Cache-Control: no-cache\r\nPragma: no-cache\r\n",
            ],
        ])
    );

    if (!is_string($json) || $json === '') {
        return [];
    }

    $data = json_decode($json, true);

    return is_array($data) ? $data : [];
}

function brivaciaCurrentVersion(): string {
    return function_exists('brivacia_version') ? brivacia_version() : '0.0.0';
}

function brivaciaTestUpdate(): bool
{
    return is_file(brivacia_root_path('update/test-update'));
}

function brivaciaUpdateAvailable(): bool {
    if (brivaciaTestUpdate()) {
        return true;
    }

    $manifest = brivaciaUpdateManifest();

    if (empty($manifest['version'])) {
        return false;
    }

    return version_compare((string)$manifest['version'], brivaciaCurrentVersion(), '>');
}

function brivaciaUpdateInfo(): array {
    $manifest = brivaciaUpdateManifest();

    return [
        'available' => brivaciaTestUpdate() || (!empty($manifest['version']) && version_compare((string)$manifest['version'], brivaciaCurrentVersion(), '>')),
        'current' => brivaciaCurrentVersion(),
        'latest' => (string)($manifest['version'] ?? ''),
        'download' => (string)($manifest['download'] ?? ''),
        'changelog' => (string)($manifest['changelog'] ?? ''),
        'minimum_php' => (string)($manifest['minimum_php'] ?? ''),
    ];
}

function brivaciaLatestVersion(): string
{
    return brivaciaUpdateInfo()['latest'] ?? brivacia_version();
}