substr($i, 0, -5), ...(json_decode(file_get_contents("./data/docs/" . $i), true) ?? []) ]; }, array_filter(scandir("./data/docs"), function ($i) { return !str_starts_with($i, ".") && str_ends_with($i, ".json"); })); $deletable = array_values(array_filter($documents, function ($i) { return str_starts_with(strip_tags($i["contents"]), "/delete"); })); foreach ($deletable as $item) { if (time() - $item["last"]["date"] > 86400) { unlink("./data/docs/" . $item["id"] . ".json"); } } $times["docs_cleanup"] = microtime(true) - $currentOpStart; require_once "./cleanup.inc"; $currentOpStart = microtime(true); $version = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/version.json"), true); $ignore = [ $_SERVER['DOCUMENT_ROOT'] . "/Data", $_SERVER['DOCUMENT_ROOT'] . "/bits/Data", $_SERVER['DOCUMENT_ROOT'] . "/Private/Data", $_SERVER['DOCUMENT_ROOT'] . "/bits/Data", $_SERVER['DOCUMENT_ROOT'] . "/bits/Private/Data", $_SERVER['DOCUMENT_ROOT'] . "/includes/data", $_SERVER['DOCUMENT_ROOT'] . "/includes/tokens", $_SERVER['DOCUMENT_ROOT'] . "/app", $_SERVER['DOCUMENT_ROOT'] . "/assets", ]; function rscandir($dir) { global $ignore; $files = []; foreach (array_filter(scandir($dir), function ($i) { return !str_starts_with($i, "."); }) as $file) { if (in_array($dir . "/" . $file, $ignore)) continue; if (is_dir($dir . "/" . $file)) { array_push($files, ...rscandir($dir . "/" . $file)); } else { $files[] = $dir . "/" . $file; } } return array_unique($files); } function calculateVersionNumber() { $files = rscandir($_SERVER['DOCUMENT_ROOT']); $hashes = []; foreach ($files as $file) { $hashes[] = md5_file($file); } $hash = md5(implode("", $hashes)); return [$hash, $hashes]; } $versionHash = calculateVersionNumber(); if ($versionHash[0] !== $version["hash"]) { $version["hash"] = $versionHash[0]; $version["timestamp"] = time(); $version["revision"] = 0; $version["list"] = [ "current" => $versionHash[1], "old" => isset($version["list"]) ? $version["list"]["current"] ?? null : null ]; $version["build"]++; } else { $version["revision"]++; } file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/version.json", json_encode($version)); $times["version"] = microtime(true) - $currentOpStart; function getSystem(string $id, string $fileName = null, string $token = null) { global $times; if (!isset($fileName)) { $fileName = $id; } if (isset($token)) { $ctx = stream_context_create([ 'http' => [ 'method' => 'GET', 'header' => "Authorization: " . $token . "\r\n" ] ]); } else { $ctx = stream_context_create([ 'http' => [ 'method' => 'GET' ] ]); } echo("System: $id\n"); echo(" Base system info\n"); $currentOpStart = microtime(true); $data = file_get_contents("https://pluralkit.equestria.dev/v2/systems/$id", false, $ctx); if (trim($data) !== "" && $data !== false) { file_put_contents("./data/$fileName/general.json", $data); } $times["system-general-" . md5($id)] = microtime(true) - $currentOpStart; echo(" System members\n"); $currentOpStart = microtime(true); $data = file_get_contents("https://pluralkit.equestria.dev/v2/systems/$id/members", false, $ctx); if (trim($data) !== "" && $data !== false) { $parsed = json_decode($data, true); foreach ($parsed as $index => $member) { if (!isset($member["color"])) { if (isset($member["avatar_url"])) { $dominantColor = substr(ColorThief::getColor($member["avatar_url"], outputFormat: "hex"), 1); } else { $dominantColor = "ffffff"; } $parsed[$index]["color"] = $dominantColor; } } $data = json_encode($parsed, JSON_PRETTY_PRINT); file_put_contents("./data/$fileName/members.json", $data); } $times["system-members-" . md5($id)] = microtime(true) - $currentOpStart; echo(" Fronters\n"); $data = file_get_contents("https://pluralkit.equestria.dev/v2/systems/$id/fronters", false, $ctx); if (trim($data) !== "" && $data !== false) { file_put_contents("./data/$fileName/fronters.json", $data); } $times["system-fronters-" . md5($id)] = microtime(true) - $currentOpStart; echo(" Switches\n"); $currentOpStart = microtime(true); echo(" Part 1/6\n"); $switches1 = json_decode(file_get_contents("https://pluralkit.equestria.dev/v2/systems/$id/switches", false, $ctx), true); if (count($switches1) > 0) { $oldest = $switches1[count($switches1) - 1]["timestamp"]; echo(" Part 2/6\n"); $switches2 = json_decode(file_get_contents("https://pluralkit.equestria.dev/v2/systems/$id/switches?before=$oldest", false, $ctx), true); if (count($switches2) > 0) { $oldest = $switches2[count($switches2) - 1]["timestamp"]; echo(" Part 3/6\n"); $switches3 = json_decode(file_get_contents("https://pluralkit.equestria.dev/v2/systems/$id/switches?before=$oldest", false, $ctx), true); if (count($switches3) > 0) { $oldest = $switches3[count($switches3) - 1]["timestamp"]; echo(" Part 4/6\n"); $switches4 = json_decode(file_get_contents("https://pluralkit.equestria.dev/v2/systems/$id/switches?before=$oldest", false, $ctx), true); if (count($switches4) > 0) { $oldest = $switches4[count($switches4) - 1]["timestamp"]; echo(" Part 5/6\n"); $switches5 = json_decode(file_get_contents("https://pluralkit.equestria.dev/v2/systems/$id/switches?before=$oldest", false, $ctx), true); if (count($switches5) > 0) { $oldest = $switches5[count($switches5) - 1]["timestamp"]; echo(" Part 6/6\n"); $switches6 = json_decode(file_get_contents("https://pluralkit.equestria.dev/v2/systems/$id/switches?before=$oldest", false, $ctx), true); } else { $switches6 = []; } } else { $switches5 = $switches6 = []; } } else { $switches4 = $switches5 = $switches6 = []; } } else { $switches3 = $switches4 = $switches5 = $switches6 = []; } } else { $switches2 = $switches3 = $switches4 = $switches5 = $switches6 = []; } if ($switches1 !== null && $switches2 !== null && $switches3 !== null && $switches4 !== null && $switches5 !== null && $switches6 !== null) { file_put_contents("./data/$fileName/switches.json", json_encode([...$switches1, ...$switches2, ...$switches3, ...$switches4, ...$switches5, ...$switches6], JSON_PRETTY_PRINT)); $times["system-switches-" . md5($id)] = microtime(true) - $currentOpStart; } } getSystem("gdapd"); // Raindrops getSystem("ynmuc"); // Cloudburst if (isset($app["other"]) && isset($app["other"]["id"]) && isset($app["other"]["token"])) { getSystem($app["other"]["id"], "other", $app["other"]["token"]); } if (!is_link($_SERVER['DOCUMENT_ROOT'] . "/includes/data/" . $app["other"]["id"])) { link($_SERVER['DOCUMENT_ROOT'] . "/includes/data/other", $_SERVER['DOCUMENT_ROOT'] . "/includes/data/" . $app["other"]["id"]); } echo("Backing up...\n"); $lastBackup = (int)trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/backup.txt")); if (time() - $lastBackup >= 3600) { require_once "./backup.inc"; file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/backup.txt", time()); echo("Backup completed\n"); } else { echo("Backup skipped\n"); } echo("Generating logo...\n"); $currentOpStart = microtime(true); require_once "./logo.inc"; $times["logo"] = microtime(true) - $currentOpStart; echo("Generated logo\n"); echo("Fetching school information...\n"); file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/school.json", "{}"); $currentOpStart = microtime(true); chdir("./external/school"); exec("node index.js"); chdir("../.."); $times["school"] = microtime(true) - $currentOpStart; echo("Fetched school information\n"); echo("Downloading assets...\n"); $currentOpStart = microtime(true); require_once "./assets.inc"; $times["assets"] = microtime(true) - $currentOpStart; echo("Downloading assets\n"); $time = array_sum($times); echo("Completed in " . $time . " seconds.\n"); file_put_contents("./data/refresh.json", json_encode([ "timestamp" => microtime(true), "duration" => $time, "restored" => $restored, "times" => $times ]));