=")) $problems[] = "Incompatible PHP version: " . PHP_VERSION . " (7.3+ required, 7.4+ recommended)"; if(!is_dir(__DIR__ . "/vendor")) $problems[] = "Composer dependencies missing"; $requiredExtensions = [ "gd", "fileinfo", "PDO", "pdo_mysql", "pcre", "hash", "curl", "Core", "iconv", "mbstring", "sodium", "openssl", "json", "tokenizer", "libxml", "date", "session", "SPL", ]; if(sizeof($missingExtensions = array_diff($requiredExtensions, get_loaded_extensions())) > 0) foreach($missingExtensions as $extension) $problems[] = "Missing extension $extension"; if(sizeof($problems) > 0) { require __DIR__ . "/misc/install_err.phtml"; exit; } } function ovk_proc_strtr(string $string, int $length = 0): string { $newString = iconv_substr($string, 0, $length); return $newString . ($string !== $newString ? "…" : ""); #if cut hasn't happened, don't append "..." } function bmask(int $input, array $options = []): Bitmask { return new Bitmask($input, $options["length"] ?? 1, $options["mappings"] ?? []); } function tr(string $stringId, ...$variables): string { $localizer = Localizator::i(); $lang = Session::i()->get("lang", "ru"); $output = $localizer->_($stringId, $lang); if(sizeof($variables) > 0) { if(gettype($variables[0]) === "integer") { $numberedStringId = NULL; $cardinal = $variables[0]; switch($cardinal) { case 0: $numberedStringId = $stringId . "_zero"; break; case 1: $numberedStringId = $stringId . "_one"; break; default: $numberedStringId = $stringId . ($cardinal < 5 ? "_few" : "_other"); } $newOutput = $localizer->_($numberedStringId, $lang); if($newOutput === "@$numberedStringId") { $newOutput = $localizer->_($stringId . "_other", $lang); if($newOutput === ("@" . $stringId . "_other")) $newOutput = $output; } $output = $newOutput; } for($i = 0; $i < sizeof($variables); $i++) $output = preg_replace("%(? $db->dsn, "user" => $db->user, "password" => $db->password, "caching" => [ "folder" => __DIR__ . "/tmp", ], ]); } #NOTICE: invalid name, kept for compatability function ovk_proc_strtrim(string $string, int $length = 0): string { trigger_error("ovk_proc_strtrim is deprecated, please use fully compatible ovk_proc_strtr.", E_USER_DEPRECATED); return ovk_proc_strtr($string, $length); } function ovk_strftime_safe(string $format, ?int $timestamp = NULL): string { $str = strftime($format, $timestamp ?? time()); if(PHP_SHLIB_SUFFIX === "dll") { $enc = tr("__WinEncoding"); if($enc === "@__WinEncoding") $enc = "Windows-1251"; $nStr = iconv($enc, "UTF-8", $str); if(!is_null($nStr)) $str = $nStr; } return $str; } function ovk_is_ssl(): bool { if(!isset($GLOBALS["requestIsSSL"])) { $GLOBALS["requestIsSSL"] = false; if(isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] !== "off") { $GLOBALS["requestIsSSL"] = true; } else { $forwardedProto = $_SERVER["HTTP_X_FORWARDED_PROTO"] ?? ($_SERVER["HTTP_X_FORWARDED_PROTOCOL"] ?? ($_SERVER["HTTP_X_URL_SCHEME"] ?? "")); if($forwardedProto === "https") $GLOBALS["requestIsSSL"] = true; else if(($_SERVER["HTTP_X_FORWARDED_SSL"] ?? "") === "on") $GLOBALS["requestIsSSL"] = true; } } return $GLOBALS["requestIsSSL"]; } function ovk_scheme(): string { return ovk_is_ssl() ? "https" : "http"; } return (function() { _ovk_check_environment(); require __DIR__ . "/vendor/autoload.php"; setlocale(LC_TIME, "POSIX"); if(empty($_SERVER["REQUEST_SCHEME"])) $_SERVER["REQUEST_SCHEME"] = empty($_SERVER["HTTPS"]) ? "HTTP" : "HTTPS"; $showCommitHash = true; # plz remove when release if(is_dir($gitDir = OPENVK_ROOT . "/.git") && $showCommitHash) $ver = trim(`git --git-dir="$gitDir" log --pretty="%h" -n1 HEAD` ?? "Unknown version") . "-nightly"; else $ver = "Build 15"; define("OPENVK_VERSION", "Altair Preview ($ver)", false); define("OPENVK_DEFAULT_PER_PAGE", 10, false); define("__OPENVK_ERROR_CLOCK_IN_FUTURE", "Server clock error: FK1200-DTF", false); });