diff options
author | Minteck <46352972+Minteck@users.noreply.github.com> | 2021-08-01 22:28:15 +0200 |
---|---|---|
committer | Minteck <46352972+Minteck@users.noreply.github.com> | 2021-08-01 22:28:15 +0200 |
commit | 9852b6cd074cceec0d0b549bb6c9bd7fe50c86f2 (patch) | |
tree | 22d9b851864f9370282f21d10113afd5d565e4cf | |
parent | b028da9fea70c65ccd52d1d478859739027d756a (diff) | |
download | main-9852b6cd074cceec0d0b549bb6c9bd7fe50c86f2.tar.gz main-9852b6cd074cceec0d0b549bb6c9bd7fe50c86f2.tar.bz2 main-9852b6cd074cceec0d0b549bb6c9bd7fe50c86f2.zip |
Update
92 files changed, 1275 insertions, 73 deletions
@@ -1,3 +1,5 @@ includes/stats/credentials.json archive/get -.htaccess
\ No newline at end of file +.htaccess +admin/private/app.json +includes/telemetry.json
\ No newline at end of file diff --git a/.idea/deployment.xml b/.idea/deployment.xml index 037d602..2faa525 100644 --- a/.idea/deployment.xml +++ b/.idea/deployment.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> - <component name="PublishConfigData" autoUpload="Always" serverName="Familine" remoteFilesAllowedToDisappearOnAutoupload="false"> + <component name="PublishConfigData" autoUpload="Always" serverName="Familine" exclude=".git;.svn;.cvs;.idea;.DS_Store;.hg;*.hprof;*.pyc" remoteFilesAllowedToDisappearOnAutoupload="false"> <serverData> <paths name="Familine"> <serverdata> diff --git a/about/index.php b/about/index.php index 51a82ed..ce31b09 100644 --- a/about/index.php +++ b/about/index.php @@ -150,7 +150,7 @@ </ul> </li> - <li>Managing powerful infrastructures (with up to 5 machines) with specific software + <li><?= l("Managing powerful infrastructures (with up to 5 machines) with specific software", "Gérer de puissantes infrastructures (comprenant jusqu'à 5 machines) avec des logiciels spécifiques") ?> <ul> <li> <details> @@ -280,7 +280,6 @@ <li><?= l("WebSocket", "WebSocket") ?></li> <li><?= l("CI/CD", "CI/CD") ?></li> <li><?= l("Version Control System (I mainly use Git and Subversion)", "Systèmes de contrôle de versions (j'utilise principalement Git et Subversion)") ?></li> - <li><?= l("CI/CD", "CI/CD") ?></li> <li><i><?= l("I probably omitted some other cool stuff that I know about...", "j'ai probablement oublié quelques trucs géniaux que je connais...") ?></i></li> </ul> </details> @@ -294,17 +293,17 @@ <h2><?= l("Prove my identity", "Prouver mon identité") ?></h2> <blockquote> - <?= l("You might have or find some other keys I used but for which I've lost the private key so I cannot use those anymore.", "Vous pourriez avoir ou trouver d'autres clés que j'ai utilisée mais dont j'ai perdu la clé privé et que je ne peux donc plus utiliser maintenant.") ?> + <?= l("You might have or find some other keys I used but for which I've lost the private key so I cannot use those anymore.", "Vous pourriez avoir ou trouver d'autres clés que j'ai utilisé mais dont j'ai perdu la clé privée et que je ne peux donc plus utiliser maintenant.") ?> </blockquote> <ul> <li> <details> <summary><?= l("SSH public key", "Clé publique SSH") ?></summary> - <b>Primary</b> (recommended): + <?= l("<b>Primary</b> (recommended):", "<b>Primaire</b> (recommandé) :") ?> <div class="code"> ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCsQFXfZUN/jlEk0SaJ7RO/68JuLrVPA3lxkRWkmsMm+bcAljCLhEmDzOeH+k56qp33uopM6B/KfZ6kEj8jw80QZe3mpZJ5HU2xI6lu14emXb5TY2J/A0hmiP4LrRxkoWjX/rzVA7WALi2D6WjmAWgkXdNgyz4lCgX5eQsYmdWLBFBFhCNJBJy//EPVdSNTjWeJcNGIM5uOIyyGJSnQ3u+2Z2WzRJ/uRvCEIj1DZ3mOON8NvFV7Kfi7lemDT0gybTO3tDmpuIUDFr2jFueKkgeME5f48GXz4uBFRXTzStq/NVbDswkjoizoHay60EGysCZzvCDs6WzLYzBZ8iS85AAcIeKyt3tBR47IpdHk/ko5hPNNl7YeW4hSJgL+utjw1VBnCqGqYctiEsusmre+c2/yRZHpb8xkmpU9XpEa9Af2mboZrUc6KIttUDZp8Dg2vpFoX4JvoPzgamhyaIwZxcwRTqBX8STaSyf68+sghyyKdN/QWmfuM/767hGkI08s8mc= minteck@Mintecks-Laptop </div> - <b>Secondary</b>: + <?= l("<b>Secondary</b>:", "<b>Secondaire</b> :") ?> <div class="code"> ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQHDZ1EfavdLe4kFCAGiXVMlceA+I8EgGZNKSgSpi/ojrsKIZX/HrcUFdttCG18KAWcMzgjn8znMkCIspsdxquFJBNwj8yqKooP9GO02THgVeGQBtH8SnnyFafakfhMPd+WEP9VVuz2EjroxUCvM8VDMg3UDjD7VX1eXp6PB+qYRJTmeUpS+BkwH3gI1tJNJfETR9JAt/GhVVPkD8xV1CJrSWXgmuj0i8YChEEgQQUTT2QRA2JnMzJmx50m41aIMFdoOAck/bun8ePGVUfKQVjAC6gQ4/EAgvbaD5xmiy1i1hXcB4U0NoWhP5YfTtIcoSNmjDDxhBM6M3fACMswqzMy1d+z7CSN+VYgHPl7USK5tGYwL3pGHFAjmcWCFKftVWB/v0/RVH3828WeceXh1IbPyG6sACbG6t9PttDDAYFaiBXp2Ybk6U+uRN1ZkwaCY9yf9TPVc3+VSjC2m/+n7nF3QxI5M7YY6h+inTOJYHRVPssPpVOUQr3FH5kwuS3ORE= minteck@kde-neon </div> @@ -312,8 +311,8 @@ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCsQFXfZUN/jlEk0SaJ7RO/68JuLrVPA3lxkRWkmsMm </li> <li> <details> - <summary><?= l("E-mail PGP public key", "E-mail PGP public key") ?></summary> - <p><b>minteckthefurry@protonmail.com</b> (also see: <a href="/contact">Contact me</a>):</p> + <summary><?= l("E-mail PGP public key", "Clé PGP publique pour les e-mail") ?></summary> + <p><b>minteckthefurry@protonmail.com</b> (<?= l("also see: <a href='/contact'>Contact me</a>", "voir aussi : <a href='/contact'>Me contacter</a>") ?>)<?= l("", " ") ?>:</p> <div class="code"> -----BEGIN PGP PUBLIC KEY BLOCK-----<br> Version: OpenPGP.js v4.10.10<br> diff --git a/admin/api/_demo.php b/admin/api/_demo.php new file mode 100644 index 0000000..e4651f1 --- /dev/null +++ b/admin/api/_demo.php @@ -0,0 +1,5 @@ +<?php + +require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.api.php"; + +// Do your API stuff here!
\ No newline at end of file diff --git a/admin/api/getUbuntuUpgrades.php b/admin/api/getUbuntuUpgrades.php new file mode 100644 index 0000000..dcf06ce --- /dev/null +++ b/admin/api/getUbuntuUpgrades.php @@ -0,0 +1,10 @@ +<?php + +require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.api.php"; + +exec("bash -c \"sudo do-release-upgrade -c | grep 'New release'\"", $ret); +if (count($ret) === 1) { + echo("<b>Ubuntu " . explode("'", $ret[0])[1] . "</b> is available, use <code>do-release-upgrade</code> to upgrade"); +} else { + echo("This server is running the latest version of Ubuntu"); +}
\ No newline at end of file diff --git a/admin/api/getUpdates.php b/admin/api/getUpdates.php new file mode 100644 index 0000000..57ce275 --- /dev/null +++ b/admin/api/getUpdates.php @@ -0,0 +1,26 @@ +<?php + +header("Content-Type: application/json"); +require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.api.php"; + +exec("bash -c \"sudo apt-get upgrade -s| grep ^Inst\"", $ret); +$data = []; +$data["count"] = count($ret); +$data["packages"] = []; + +foreach ($ret as $package) { + $parts = explode(" ", trim($package)); + $pkg = [ + "name" => trim($parts[1]), + "version" => [ + "local" => trim(explode("]", explode("[", $parts[2])[1])[0]), + "remote" => trim(explode("(", $parts[3])[1]), + ], + "repos" => trim(explode(":", explode("(", explode("[", trim($package))[1])[1])[1]), + "architecture" => trim(explode("]", explode("[", trim($package))[2])[0]) + ]; + + $data["packages"][] = $pkg; +} + +echo(json_encode($data, JSON_PRETTY_PRINT));
\ No newline at end of file diff --git a/admin/api/refreshUpdates.php b/admin/api/refreshUpdates.php new file mode 100644 index 0000000..ea6f991 --- /dev/null +++ b/admin/api/refreshUpdates.php @@ -0,0 +1,4 @@ +<?php + +require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.api.php"; +exec("bash -c \"sudo apt-get update", $ret);
\ No newline at end of file diff --git a/admin/api/serverLogSummary.php b/admin/api/serverLogSummary.php new file mode 100644 index 0000000..2d90fe1 --- /dev/null +++ b/admin/api/serverLogSummary.php @@ -0,0 +1,8 @@ +<?php + +require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.api.php"; + +exec("journalctl -b --quiet", $ret); +$cnt = count($ret); + +echo("<b>" . $cnt . "</b> system log messages since last system startup");
\ No newline at end of file diff --git a/admin/api/serverTemp.php b/admin/api/serverTemp.php new file mode 100644 index 0000000..19e383a --- /dev/null +++ b/admin/api/serverTemp.php @@ -0,0 +1,20 @@ +<?php + +require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.api.php"; + +echo("Server running at <b>"); +exec("sensors -j", $out); +$outp = implode("\n", $out); +$outd = json_decode($outp, true); + +echo(round($outd["cpu_thermal-virtual-0"]["temp1"]["temp1_input"], 1)); + +?>°C</b>, <?php + +if ($outd["cpu_thermal-virtual-0"]["temp1"]["temp1_input"] > 90) { + echo("completely overheating!"); +} else if ($outd["cpu_thermal-virtual-0"]["temp1"]["temp1_input"] > 60) { + echo("starting to throttle!"); +} else { + echo("under normal temperatures"); +}
\ No newline at end of file diff --git a/admin/api/serverTime.php b/admin/api/serverTime.php new file mode 100644 index 0000000..d0db5e3 --- /dev/null +++ b/admin/api/serverTime.php @@ -0,0 +1,12 @@ +<?php + +require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.api.php"; + +$str = file_get_contents('/proc/uptime'); +$num = floatval($str); +$secs = fmod($num, 60); $num = intdiv($num, 60); +$mins = $num % 60; $num = intdiv($num, 60); +$hours = $num % 24; $num = intdiv($num, 24); +$days = $num; + +echo($days . " day·s, " . $hours . " hour·s, " . $mins . " minute·s, " . ceil($secs) . " second·s");
\ No newline at end of file diff --git a/admin/api/terminateAllSessions.php b/admin/api/terminateAllSessions.php new file mode 100644 index 0000000..2aa5c5f --- /dev/null +++ b/admin/api/terminateAllSessions.php @@ -0,0 +1,34 @@ +<?php + +require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.api.php"; + +if (isset($_GET['_']) && strpos($_GET['_'], "/") === false) { + $arg = $_GET['_']; +} else { + die(); +} + +$webs = scandir("/mnt/kartik/online/private/tokens"); + +foreach ($webs as $webt) { + if (!is_dir("/mnt/kartik/online/private/tokens/" . $webt)) { + $d = json_decode(file_get_contents("/mnt/kartik/online/private/tokens/" . $webt), true); + if ($d["id"] === $arg) { + unlink("/mnt/kartik/online/private/tokens/" . $webt); + } + } +} + +$webs = scandir("/mnt/kartik/online/private/gametokens"); + +foreach ($webs as $webt) { + if (!is_dir("/mnt/kartik/online/private/gametokens/" . $webt)) { + $d = json_decode(file_get_contents("/mnt/kartik/online/private/gametokens/" . $webt), true); + if ($d["id"] === $arg) { + unlink("/mnt/kartik/online/private/gametokens/" . $webt); + } + } +} + +header("Location: /admin/panes/kartik.php"); +die();
\ No newline at end of file diff --git a/admin/api/terminateGameSessions.php b/admin/api/terminateGameSessions.php new file mode 100644 index 0000000..2f895b1 --- /dev/null +++ b/admin/api/terminateGameSessions.php @@ -0,0 +1,23 @@ +<?php + +require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.api.php"; + +if (isset($_GET['_']) && strpos($_GET['_'], "/") === false) { + $arg = $_GET['_']; +} else { + die(); +} + +$webs = scandir("/mnt/kartik/online/private/gametokens"); + +foreach ($webs as $webt) { + if (!is_dir("/mnt/kartik/online/private/gametokens/" . $webt)) { + $d = json_decode(file_get_contents("/mnt/kartik/online/private/gametokens/" . $webt), true); + if ($d["id"] === $arg) { + unlink("/mnt/kartik/online/private/gametokens/" . $webt); + } + } +} + +header("Location: /admin/panes/kartik.php"); +die(); diff --git a/admin/api/terminateWebSessions.php b/admin/api/terminateWebSessions.php new file mode 100644 index 0000000..956782f --- /dev/null +++ b/admin/api/terminateWebSessions.php @@ -0,0 +1,23 @@ +<?php + +require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.api.php"; + +if (isset($_GET['_']) && strpos($_GET['_'], "/") === false) { + $arg = $_GET['_']; +} else { + die(); +} + +$webs = scandir("/mnt/kartik/online/private/tokens"); + +foreach ($webs as $webt) { + if (!is_dir("/mnt/kartik/online/private/tokens/" . $webt)) { + $d = json_decode(file_get_contents("/mnt/kartik/online/private/tokens/" . $webt), true); + if ($d["id"] === $arg) { + unlink("/mnt/kartik/online/private/tokens/" . $webt); + } + } +} + +header("Location: /admin/panes/kartik.php"); +die();
\ No newline at end of file diff --git a/admin/callback/index.php b/admin/callback/index.php new file mode 100644 index 0000000..d5462f9 --- /dev/null +++ b/admin/callback/index.php @@ -0,0 +1,48 @@ +<?php + +// TODO: handle errors + +if (!isset($_GET['code'])) { + die(); +} + +$appdata = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/admin/private/app.json"), true); + +$crl = curl_init('https://jetbrains.minteck.ro.lt:1024/hub/hub/api/rest/oauth2/token'); +curl_setopt($crl, CURLOPT_RETURNTRANSFER, true); +curl_setopt($crl, CURLINFO_HEADER_OUT, true); +curl_setopt($crl, CURLOPT_POST, true); +curl_setopt($crl, CURLOPT_HTTPHEADER, [ + "Authorization: Basic " . base64_encode($appdata["id"] . ":" . $appdata["secret"]), + "Content-Type: application/x-www-form-urlencoded", + "Accept: application/json" +]); +curl_setopt($crl, CURLOPT_POSTFIELDS, "grant_type=authorization_code&redirect_uri=" . urlencode("https://minteck.ro.lt/admin/callback") . "&code=" . $_GET['code']); + +$result = curl_exec($crl); +$result = json_decode($result, true); + +curl_close($crl); + +if (isset($result["access_token"])) { + $crl = curl_init('https://jetbrains.minteck.ro.lt:1024/hub/hub/api/rest/users/me'); + curl_setopt($crl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($crl, CURLINFO_HEADER_OUT, true); + curl_setopt($crl, CURLOPT_HTTPHEADER, [ + "Authorization: Bearer " . $result["access_token"], + "Accept: application/json" + ]); + + $result = curl_exec($crl); + $result = json_decode($result, true); + + if ($result["id"] === "74bca7d2-4694-477c-8bc1-9003315abbee") { + $token = bin2hex(random_bytes(32)); + file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/admin/private/tokens/" . $token, json_encode($result)); + setcookie("ADMIN_TOKEN", $token, 0, "/", ".minteck.ro.lt", true, true); + + header("Location: /admin"); + } else { + header("Location: /"); + } +}
\ No newline at end of file diff --git a/admin/index.php b/admin/index.php new file mode 100644 index 0000000..edfa596 --- /dev/null +++ b/admin/index.php @@ -0,0 +1,181 @@ +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.php"; ?> + +<!--suppress CssFloatPxLength --> +<style> + .section { + color: gray; + font-variant: all-petite-caps; + font-size: 18px; + margin: 20px 20px 5px; + padding: 5px 7.5px 0 7.5px; + border-top: 1px solid rgba(128, 128, 128, 0.25); + } + + .item { + cursor: pointer; + margin: 0 20px; + border-radius: 5px; + padding: 2.5px 7.5px; + color: lightgray; + } + + .item:hover { + background: rgba(255, 255, 255, .1); + color: #c2c2c2; + } + + .item:active, .item:focus, .item.selected { + color: #e7e7e7 !important; + background: rgba(255, 255, 255, .2) !important; + cursor: default; + } + + ::-webkit-scrollbar { + width: 5px; + } + + ::-webkit-scrollbar-track { + border-radius: 9999px; + background: transparent; + } + + ::-webkit-scrollbar-thumb { + border-radius: 9999px; + background-color: rgba(136, 136, 136, 0.5); + transition: background 200ms; + } + + ::-webkit-scrollbar-thumb:hover { + background-color: rgba(85, 85, 85, 0.75); + } + + ::-webkit-scrollbar-thumb:active { + background-color: #222; + } + + .credits { + margin: 15px 20px 0 20px; + border-radius: 5px; + padding: 2.5px 7.5px; + color: lightgray; + opacity: .25; + font-size: 12px; + } + + .reloadbtn { + vertical-align: middle; + float: right; + display: none; + opacity: 0; + transition: opacity 200ms, transform 500ms; + transform: rotate(0deg); + } + + .item.selected .reloadbtn { + display: inline-block; + opacity: 1; + } +</style> + +<div style="position: fixed;inset: 0;z-index: 5;backdrop-filter:blur(10px);background:rgba(47,49,54,1);height:100%;display:grid;grid-template-columns: 256px 1fr;"> + <div id="menu" style="height:100%;overflow-y: scroll;"> + <div class="item selected" id="activity-home" style="margin-top:15vh;"> + Home + <img alt="" src="/static/reload.png" class="reloadbtn"> + </div> + + <h3 class="section">System</h3> + <div class="item" id="activity-uptime"> + Uptime + <img alt="" src="/static/reload.png" class="reloadbtn"> + </div> + <div class="item" id="activity-version"> + Software Versions + <img alt="" src="/static/reload.png" class="reloadbtn"> + </div> + + <h3 class="section">Member Management</h3> + <div class="item" id="activity-unchained"> + UnchainedTech + <img alt="" src="/static/reload.png" class="reloadbtn"> + </div> + <div class="item" id="activity-kartik"> + Kartik Online + <img alt="" src="/static/reload.png" class="reloadbtn"> + </div> + + <h3 class="section">Minteck Space</h3> + <div class="item" id="activity-blog"> + Blog + <img alt="" src="/static/reload.png" class="reloadbtn"> + </div> + <div class="item" id="activity-telemetry"> + Telemetry + <img alt="" src="/static/reload.png" class="reloadbtn"> + </div> + <div class="item" id="activity-code"> + Code of Conduct + <img alt="" src="/static/reload.png" class="reloadbtn"> + </div> + + <h3 class="section">Neutron Cloud</h3> + <div class="item" id="activity-quotas"> + Quotas + <img alt="" src="/static/reload.png" class="reloadbtn"> + </div> + <div class="item" id="activity-neutroning"> + Sites Map + <img alt="" src="/static/reload.png" class="reloadbtn"> + </div> + + <div class="credits" style="margin-bottom:15vh;"> + Release <?= substr(md5_file($_SERVER['DOCUMENT_ROOT'] . "/admin/index.php"), 0, 7); ?><br> + Host <?= PHP_VERSION ?><br> + <?= php_uname('s') ?> <?= php_uname('r') ?> + </div> + </div> + + <div id="content" style="background:rgba(54,57,63,1);"> + <iframe id="content-frame" src="/admin/panes/home.php" style="background: transparent;border: none;height: 100%;width: 100%;"></iframe> + </div> + + <script> + + function activity(id, url, target) { + if (target.classList.contains("selected")) return; + if (target.classList.contains("reloadbtn")) return; + + Array.from(document.getElementsByClassName("item")).forEach((item) => { + item.classList.remove("selected"); + }) + + document.getElementById(id).classList.add("selected"); + document.getElementById("content-frame").src = url; + } + + document.getElementById("activity-home").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/home.php", event.target); }, true) + document.getElementById("activity-uptime").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/uptime.php", event.target); }, true) + document.getElementById("activity-version").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/version.php", event.target); }, true) + document.getElementById("activity-kartik").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/kartik.php", event.target); }, true) + document.getElementById("activity-blog").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/blog.php", event.target); }, true) + document.getElementById("activity-code").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/code.php", event.target); }, true) + document.getElementById("activity-quotas").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/quotas.php", event.target); }, true) + document.getElementById("activity-neutroning").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/neutroning.php", event.target); }, true) + document.getElementById("activity-telemetry").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/telemetry.php", event.target); }, true) + document.getElementById("activity-unchained").addEventListener("click", (event) => { activity(event.target.id, "/admin/panes/unchained.php", event.target); }, true) + + Array.from(document.getElementsByClassName("reloadbtn")).forEach((item) => { + item.addEventListener("click", (event) => { + if (event.target.style.transform === "rotate(-360deg)") { + event.target.style.transform = "rotate(0deg)"; + } else { + event.target.style.transform = "rotate(-360deg)"; + } + document.getElementById("content-frame").contentWindow.location.reload(true); + }) + }) + + </script> +</div> + +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/footer.php"; ?>
\ No newline at end of file diff --git a/admin/panes/home.php b/admin/panes/home.php new file mode 100644 index 0000000..ac106e4 --- /dev/null +++ b/admin/panes/home.php @@ -0,0 +1,136 @@ +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.php";/** @var array $_DATA */ ?> + +<style> + ::-webkit-scrollbar { + width: 5px; + } + + ::-webkit-scrollbar-track { + border-radius: 9999px; + background: transparent; + } + + ::-webkit-scrollbar-thumb { + border-radius: 9999px; + background-color: rgba(136, 136, 136, 0.5); + transition: background 200ms; + } + + ::-webkit-scrollbar-thumb:hover { + background-color: rgba(85, 85, 85, 0.75); + } + + ::-webkit-scrollbar-thumb:active { + background-color: #222; + } + + .list-group-item { + background: #34373c; + } +</style> + +<div class="container" style="color:white;padding-top:15vh;padding-bottom:15vh;"> + <h2 style="text-align:center;">Welcome back <?= $_DATA["name"] ?>!</h2> + <ul class="list-group" style="margin-top:30px;"> + <li class="list-group-item"> + <span id="temperature">Server running at <b><?php + + exec("sensors -j", $out); + $outp = implode("\n", $out); + $outd = json_decode($outp, true); + + echo(round($outd["cpu_thermal-virtual-0"]["temp1"]["temp1_input"], 1)); + + ?>°C</b>, <?php + + if ($outd["cpu_thermal-virtual-0"]["temp1"]["temp1_input"] > 90) { + echo("completely overheating!"); + } else if ($outd["cpu_thermal-virtual-0"]["temp1"]["temp1_input"] > 60) { + echo("starting to throttle!"); + } else { + echo("under normal temperatures"); + } + + ?></span> <a href="#" onclick="window.parent.activity('activity-version', '/admin/panes/version.php', window.parent.document.getElementById('activity-version'));" style="float:right;">Manage...</a></li><li class="list-group-item"><b><?php + + $uca = scandir("/mnt/blogchain/_posts"); + $uct = []; + + foreach ($uca as $art) { + if (is_file("/mnt/blogchain/_posts/" . $art) && substr($art, 0, 1) !== "." && substr($art, 0, 1) !== "_") { + $uct[] = $art; + } + } + + echo(count($uct)); + + ?></b> UnchainedTech article·s, <?php + + $uca = scandir("/mnt/blogchain/_posts/_drafts"); + $uct2 = []; + + foreach ($uca as $art) { + if (is_file("/mnt/blogchain/_posts/_drafts/" . $art) && substr($art, 0, 1) !== "." && substr($art, 0, 1) !== "_") { + $uct2[] = $art; + } + } + + echo(count($uct2)); + + ?> draft·s <a onclick="window.parent.activity('activity-unchained', '/admin/panes/unchained.php', window.parent.document.getElementById('activity-unchained'));" href="#" style="float:right;">Manage...</a></li> + <li class="list-group-item"><b><?php + + $uca = scandir("/mnt/minteckrolt-cloud"); + $uct3 = []; + + foreach ($uca as $art) { + if (is_dir("/mnt/minteckrolt-cloud/" . $art) && substr($art, 0, 1) === "~") { + $uct3[] = $art; + } + } + + echo(count($uct3)); + + ?></b> Neutron Cloud website·s <a onclick="window.parent.activity('activity-quotas', '/admin/panes/quotas.php', window.parent.document.getElementById('activity-quotas'));" href="#" style="float:right;">Manage...</a></li> + <li class="list-group-item"><b><?php + + $uca = scandir("/mnt/kartik/online/private/stats"); + $uct4 = []; + + foreach ($uca as $art) { + if (is_file("/mnt/kartik/online/private/stats/" . $art)) { + $uct4[] = $art; + } + } + + echo(count($uct4)); + + ?></b> Kartik Online player·s <a onclick="window.parent.activity('activity-kartik', '/admin/panes/kartik.php', window.parent.document.getElementById('activity-kartik'));" href="#" style="float:right;">Manage...</a></li> + <li class="list-group-item"><b><?php + + $uca = scandir("/mnt/minteckrolt-main/includes/blog/data"); + $uct5 = []; + + foreach ($uca as $art) { + if (is_dir("/mnt/minteckrolt-main/includes/blog/data/" . $art)) { + $uct4[] = $art; + } + } + + echo(count($uct4)); + + ?></b> blog article·s <a onclick="window.parent.activity('activity-blog', '/admin/panes/blog.php', window.parent.document.getElementById('activity-blog'));" href="#" style="float:right;">Manage...</a></li> + </ul> + <!--suppress JSUnresolvedVariable, JSUnresolvedFunction --> + <script> + setInterval(() => { + $.ajax("/admin/api/serverTemp.php", { + success: (data) => { + document.getElementById("temperature").innerHTML = data; + } + }); + }, 500) + </script> +</div> + +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/footer.php"; ?>
\ No newline at end of file diff --git a/admin/panes/kartik.php b/admin/panes/kartik.php new file mode 100644 index 0000000..87a975f --- /dev/null +++ b/admin/panes/kartik.php @@ -0,0 +1,111 @@ +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.php";/** @var array $_DATA */ ?> + +<style> + ::-webkit-scrollbar { + width: 5px; + } + + ::-webkit-scrollbar-track { + border-radius: 9999px; + background: transparent; + } + + ::-webkit-scrollbar-thumb { + border-radius: 9999px; + background-color: rgba(136, 136, 136, 0.5); + transition: background 200ms; + } + + ::-webkit-scrollbar-thumb:hover { + background-color: rgba(85, 85, 85, 0.75); + } + + ::-webkit-scrollbar-thumb:active { + background-color: #222; + } + + .list-group-item { + background: #34373c; + } +</style> + +<div class="container" style="color:white;padding-top:15vh;padding-bottom:15vh;"> + <div> + <h2 style="text-align:center;">Kartik Online</h2> + <h4 style="text-align:center;"><?php + + $uca = scandir("/mnt/kartik/online/private/stats"); + $uct4 = []; + + foreach ($uca as $art) { + if (is_file("/mnt/kartik/online/private/stats/" . $art)) { + $uct4[] = $art; + } + } + + echo(count($uct4)); + + ?> player·s</h4> + + <ul class="list-group"> + <?php + + $uca = scandir("/mnt/kartik/online/private/stats"); + $uct4 = []; + + foreach ($uca as $art) { + if (is_file("/mnt/kartik/online/private/stats/" . $art)): ?> + + <li class="list-group-item"><?= $art ?> <?php + + $osession = 0; + $gsession = 0; + $tsession = 0; + + $webs = scandir("/mnt/kartik/online/private/tokens"); + $ings = scandir("/mnt/kartik/online/private/gametokens"); + + foreach ($webs as $webt) { + if (!is_dir("/mnt/kartik/online/private/tokens/" . $webt)) { + $d = json_decode(file_get_contents("/mnt/kartik/online/private/tokens/" . $webt), true); + if ($d["id"] === $art) { + $osession++; + } + } + } + + foreach ($ings as $webt) { + if (!is_dir("/mnt/kartik/online/private/gametokens/" . $webt)) { + $d = json_decode(file_get_contents("/mnt/kartik/online/private/gametokens/" . $webt), true); + if ($d["id"] === $art) { + $gsession++; + } + } + } + + $tsession = $osession + $gsession; + if ($tsession > 1) { + $tsessions = "s"; + } else { + $tsessions = ""; + } + + if ($osession > 0) { + echo("<span class='badge text-warning border-warning' style='border:1px solid;vertical-align: middle;'>{$tsession} session{$tsessions} ({$gsession}:{$osession})</span>"); + } else if ($gsession > 0) { + echo("<span class='badge text-success border-success' style='border:1px solid;vertical-align: middle;'>{$tsession} session{$tsessions} ({$gsession}:0)</span>"); + } else { + echo("<span class='badge text-light border-light' style='border:1px solid;vertical-align: middle;'>Offline (0:0)</span>"); + } + + ?> <span style="float:right;"><a href="/admin/api/terminateWebSessions.php?_=<?= $art ?>">Terminate Web</a> · <a href="/admin/api/terminateGameSessions.php?_=<?= $art ?>">Terminate Game</a> · <a href="/admin/api/terminateAllSessions.php?_=<?= $art ?>">Terminate All</a></span></li> + + <?php endif; + } + + ?> + </ul> + </div> +</div> + +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/footer.php"; ?>
\ No newline at end of file diff --git a/admin/panes/unchained.php b/admin/panes/unchained.php new file mode 100644 index 0000000..cab35b5 --- /dev/null +++ b/admin/panes/unchained.php @@ -0,0 +1,81 @@ +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.php";/** @var array $_DATA */ ?> + +<style> + ::-webkit-scrollbar { + width: 5px; + } + + ::-webkit-scrollbar-track { + border-radius: 9999px; + background: transparent; + } + + ::-webkit-scrollbar-thumb { + border-radius: 9999px; + background-color: rgba(136, 136, 136, 0.5); + transition: background 200ms; + } + + ::-webkit-scrollbar-thumb:hover { + background-color: rgba(85, 85, 85, 0.75); + } + + ::-webkit-scrollbar-thumb:active { + background-color: #222; + } + + .list-group-item { + background: #34373c; + } +</style> + +<div class="container" style="color:white;padding-top:15vh;padding-bottom:15vh;display: flex;align-items:center;justify-content: center;height:100%;" id="main"> + <div> + <p style="text-align: center;"> + <img src="/logo.svg" width="96px"><span class="text-muted"> ⏵⏵⏵ </span><!--suppress CheckImageSize --> + <img src="/static/apps/unchainedtech.png" width="96px"> + </p> + <br> + <h2 style="text-align:center;">You already have access to UnchainedTech Admin</h2> + + <h4 style="text-align:center;">We automatically logged you into UnchainedTech Admin when you logged in to Minteck Admin</h4><br> + + <div style="text-align: center;width:max-content;margin-left:auto;margin-right:auto;"> + <p class="btn-group"> + <a href="https://unchainedtech.minteck.ro.lt/articles" target="_blank" class="btn btn-outline-light">All Articles</a> + <a href="https://unchainedtech.minteck.ro.lt/admin" target="_blank" class="btn btn-outline-light">Admin Tasks</a> + </p> + </div> + + <small><p style="text-align: center;"> + v<?= trim(file_get_contents("/mnt/blogchain/version.txt")) ?> • <a href="#" onclick="document.getElementById('main').style.display='none';document.getElementById('secondary').style.display='';">Manage drafts</a> + </p></small> + </div> +</div> + + <div class="container" style="color:white;padding-top:15vh;padding-bottom:15vh;display:none;" id="secondary"> + <div> + <h2 style="text-align:center;">UnchainedTech</h2> + <h4 style="text-align:center;">Drafts List</h4> + + <small><p style="text-align: center;"> + v<?= trim(file_get_contents("/mnt/blogchain/version.txt")) ?> • <a href="#" onclick="document.getElementById('main').style.display='flex';document.getElementById('secondary').style.display='none';">Hide drafts list</a> + </p></small> + + <ul class="list-group"> + <?php + + $drafts = false; + foreach (scandir("/mnt/blogchain/_posts/_drafts") as $draft) { + if ($draft !== "." && $draft !== ".." && $draft !== ".gitkeep" && $draft !== "_template.md") { + $drafts = true; + echo('<li class="list-group-item">' . substr($draft, 0, -3) . '<span style="float:right;"><a href="https://unchainedtech.minteck.ro.lt/admin/article/' . substr($draft, 0, -3) . '" target="_blank">Preview</a> · <a href="https://github.com/Minteck/UnchainedTech-Content/edit/production/_drafts/' . $draft . '" target="_blank">Edit</a> · <a href="https://github.com/Minteck/UnchainedTech-Content/delete/production/_drafts/' . $draft . '" target="_blank">Delete</a></span></li>'); + } + } + + ?> + </ul> + </div> + </div> + +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/footer.php"; ?>
\ No newline at end of file diff --git a/admin/panes/uptime.php b/admin/panes/uptime.php new file mode 100644 index 0000000..71a6545 --- /dev/null +++ b/admin/panes/uptime.php @@ -0,0 +1,87 @@ +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.php";/** @var array $_DATA */ ?> + +<style> + ::-webkit-scrollbar { + width: 5px; + } + + ::-webkit-scrollbar-track { + border-radius: 9999px; + background: transparent; + } + + ::-webkit-scrollbar-thumb { + border-radius: 9999px; + background-color: rgba(136, 136, 136, 0.5); + transition: background 200ms; + } + + ::-webkit-scrollbar-thumb:hover { + background-color: rgba(85, 85, 85, 0.75); + } + + ::-webkit-scrollbar-thumb:active { + background-color: #222; + } + + .list-group-item { + background: #34373c; + } +</style> + +<div class="container" style="color:white;padding-top:15vh;padding-bottom:15vh;"> + <h2 style="text-align:center;">The server has been running for</h2> + + <h4 style="text-align:center;" id="uptime"><?php + + $str = @file_get_contents('/proc/uptime'); + $num = floatval($str); + $secs = fmod($num, 60); $num = intdiv($num, 60); + $mins = $num % 60; $num = intdiv($num, 60); + $hours = $num % 24; $num = intdiv($num, 24); + $days = $num; + + echo($days . " day·s, " . $hours . " hour·s, " . $mins . " minute·s, " . ceil($secs) . " second·s") + + ?></h4> + <!--suppress JSUnresolvedVariable, JSUnresolvedFunction --> + <script> + setInterval(() => { + $.ajax("/admin/api/serverTime.php", { + success: (data) => { + document.getElementById("uptime").innerText = data; + } + }); + }, 500) + </script> + + <ul class="list-group" style="margin-top:20px;"> + <li class="list-group-item"> + <b><?php + + exec("journalctl --disk-usage", $ret); + $data = trim(implode("\n", $ret)); + + $val = explode(" ", $data)[6]; + echo($val); + + ?></b> of data has been collected to ensure easy system maintenance and audit + </li> + <li class="list-group-item" id="logsummary"> + Calculating... + </li> + <!--suppress JSUnresolvedVariable, JSUnresolvedFunction --> + <script> + $.ajax("/admin/api/serverLogSummary.php", { + success: (data) => { + document.getElementById("logsummary").innerHTML = data; + }, + error: () => { + document.getElementById("logsummary").innerText = "An error occurred while loading this content"; + } + }); + </script> + </ul> +</div> + +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/footer.php"; ?>
\ No newline at end of file diff --git a/admin/panes/version.php b/admin/panes/version.php new file mode 100644 index 0000000..04ef136 --- /dev/null +++ b/admin/panes/version.php @@ -0,0 +1,139 @@ +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/header.php";/** @var array $_DATA */ ?> + +<style> + ::-webkit-scrollbar { + width: 5px; + } + + ::-webkit-scrollbar-track { + border-radius: 9999px; + background: transparent; + } + + ::-webkit-scrollbar-thumb { + border-radius: 9999px; + background-color: rgba(136, 136, 136, 0.5); + transition: background 200ms; + } + + ::-webkit-scrollbar-thumb:hover { + background-color: rgba(85, 85, 85, 0.75); + } + + ::-webkit-scrollbar-thumb:active { + background-color: #222; + } + + .list-group-item { + background: #34373c; + } +</style> + +<div class="container" style="color:white;padding-top:15vh;padding-bottom:15vh;"> + <h2 style="text-align:center;">This server is running <?= php_uname('s') ?> version</h2> + + <h4 style="text-align:center;"><?= php_uname('r') . " " . php_uname('v') ?></h4> + + <ul class="list-group" style="margin-top:20px;"> + <li class="list-group-item">PHP <?= PHP_VERSION ?></li> + <li class="list-group-item">UnchainedTech <?= trim(file_get_contents("/mnt/blogchain/version.txt")) ?></li> + <li class="list-group-item">Neutron Cloud <?= trim(file_get_contents("/mnt/minteckrolt-cloud/@BASE/source/api/version")) ?></li> + <li class="list-group-item">Neutron Copper <?= trim(file_get_contents("/mnt/minteckrolt-cloud/@BASE/source/api/cyclic_version")) ?></li> + <li class="list-group-item">Neutron Titanium <?= trim(file_get_contents("/mnt/minteckrolt-cloud/@BASE/source/api/jaw_version")) ?></li> + <li class="list-group-item"> + <?php + + $osr = []; + $lines = explode("\n", file_get_contents("/etc/os-release")); + + foreach ($lines as $line) { + if (trim($line) !== "") { + $parts = explode("=", $line); + $osr[$parts[0]] = str_replace("\"", "", $parts[1]); + } + } + + echo($osr["NAME"] . " " . $osr["VERSION"]); + + ?> + </li> + <li class="list-group-item">Git <?php exec("git --version", $res);$p = explode(" ", $res[0]);array_shift($p);array_shift($p);echo(implode(" ", $p)) ?></li> + <li class="list-group-item"><?php + + $soft = $_SERVER['SERVER_SOFTWARE']; + + if (strpos(strtolower($soft), "apache") !== false) { + echo("Apache HTTP Server"); + } else { + echo("nginx"); + } + + ?> <?php + + $soft = $_SERVER['SERVER_SOFTWARE']; + + if (strpos(strtolower($soft), "apache") !== false) { + exec("apache2 -v", $res2);$p = explode(" ", $res2[0]);array_shift($p);array_shift($p);$p2 = explode("/", implode(" ", $p));array_shift($p2);echo(implode(" ", $p2)); + } else { + exec("nginx -v", $res2);$p = explode(" ", $res2[0]);array_shift($p);array_shift($p);$p2 = explode("/", implode(" ", $p));array_shift($p2);echo(implode(" ", $p2)); + } + + ?></li> + </ul> + + <ul class="list-group" style="margin-top:20px;"> + <li id="checking" class="list-group-item">Checking for updates...</li> + <li id="checking2" class="list-group-item" style="display:none;"></li> + <li id="found" class="list-group-item" style="display:none;"> + <b id="updates-count">0</b> package·s have updates available + + <details> + <summary>View details</summary> + <ul class="list-group" id="updates-list"></ul> + </details> + </li> + </ul> + <!--suppress JSUnresolvedVariable, JSUnresolvedFunction, JSUnfilteredForInLoop --> + <script> + $.ajax("/admin/api/refreshUpdates.php", { + success: (data) => { + document.getElementById("checking").innerText = "Checking for Ubuntu upgrades..."; + $.ajax("/admin/api/getUbuntuUpgrades.php", { + success: (data) => { + document.getElementById("checking").innerHTML = data; + document.getElementById("checking2").style.display = ""; + document.getElementById("checking2").innerText = "Reading package lists..."; + $.ajax("/admin/api/getUpdates.php", { + success: (data) => { + document.getElementById("checking2").innerText = "Please wait..."; + document.getElementById("updates-count").innerText = data.count; + + dom = ""; + for (let index in data.packages) { + item = data.packages[index]; + dom += `<li class="list-group-item"><b>${item.name}</b> (<span style="color: orange;">${item.version.local}</span> → <span style="color: green;">${item.version.remote}</span>)<br>Provided by: <code>${item.repos}</code>, target architecture: <code>${item.architecture}</code></li>` + } + + document.getElementById("updates-list").innerHTML = dom; + + document.getElementById("checking2").outerHTML = ""; + document.getElementById("found").style.display = ""; + }, + error: () => { + document.getElementById("checking2").innerText = "An error occurred while loading this content"; + } + }); + }, + error: () => { + document.getElementById("checking").innerText = "An error occurred while loading this content"; + } + }); + }, + error: () => { + document.getElementById("checking").innerText = "An error occurred while loading this content"; + } + }); + </script> +</div> + +<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/admin/private/footer.php"; ?>
\ No newline at end of file diff --git a/admin/private/footer.php b/admin/private/footer.php new file mode 100644 index 0000000..691287b --- /dev/null +++ b/admin/private/footer.php @@ -0,0 +1,2 @@ +</body> +</html>
\ No newline at end of file diff --git a/admin/private/header.api.php b/admin/private/header.api.php new file mode 100644 index 0000000..ce143f6 --- /dev/null +++ b/admin/private/header.api.php @@ -0,0 +1,11 @@ +<?php + +if (!isset($_COOKIE["ADMIN_TOKEN"])) { + header("Location: https://jetbrains.minteck.ro.lt:1024/hub/hub/api/rest/oauth2/auth?client_id=36245ba5-ee9f-44c1-a149-ab2006fcb226&response_type=code&redirect_uri=https://minteck.ro.lt/admin/callback&scope=hub&request_credentials=default&access_type=offline"); + die(); +} else if (ctype_xdigit($_COOKIE["ADMIN_TOKEN"]) && file_exists($_SERVER['DOCUMENT_ROOT'] . "/admin/private/tokens/" . $_COOKIE['ADMIN_TOKEN'])) { + $_DATA = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/admin/private/tokens/" . $_COOKIE['ADMIN_TOKEN']), true); +} else { + header("Location: https://jetbrains.minteck.ro.lt:1024/hub/hub/api/rest/oauth2/auth?client_id=36245ba5-ee9f-44c1-a149-ab2006fcb226&response_type=code&redirect_uri=https://minteck.ro.lt/admin/callback&scope=hub&request_credentials=default&access_type=offline"); + die(); +}
\ No newline at end of file diff --git a/admin/private/header.php b/admin/private/header.php new file mode 100644 index 0000000..409d8d1 --- /dev/null +++ b/admin/private/header.php @@ -0,0 +1,28 @@ +<?php + +if (!isset($_COOKIE["ADMIN_TOKEN"])) { + header("Location: https://jetbrains.minteck.ro.lt:1024/hub/hub/api/rest/oauth2/auth?client_id=36245ba5-ee9f-44c1-a149-ab2006fcb226&response_type=code&redirect_uri=https://minteck.ro.lt/admin/callback&scope=hub&request_credentials=default&access_type=offline"); + die(); +} else if (ctype_xdigit($_COOKIE["ADMIN_TOKEN"]) && file_exists($_SERVER['DOCUMENT_ROOT'] . "/admin/private/tokens/" . $_COOKIE['ADMIN_TOKEN'])) { + $_DATA = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/admin/private/tokens/" . $_COOKIE['ADMIN_TOKEN']), true); +} else { + header("Location: https://jetbrains.minteck.ro.lt:1024/hub/hub/api/rest/oauth2/auth?client_id=36245ba5-ee9f-44c1-a149-ab2006fcb226&response_type=code&redirect_uri=https://minteck.ro.lt/admin/callback&scope=hub&request_credentials=default&access_type=offline"); + die(); +} + +?> + +<!DOCTYPE html> +<html lang="en" style="height:100%;"> +<head> + <meta charset="UTF-8"> + <title>Minteck Admin</title> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link rel="icon" href="/logo.svg"> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> + <link rel="stylesheet" href="/static/css/fonts"> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script> + <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> +</head> +<body class="admin" style="background-color:transparent;height:100%;">
\ No newline at end of file diff --git a/admin/session/index.php b/admin/session/index.php new file mode 100644 index 0000000..3dbf45a --- /dev/null +++ b/admin/session/index.php @@ -0,0 +1,6 @@ +<?php + +var_dump($_GET); +var_dump($_POST); +var_dump($_SERVER); +die();
\ No newline at end of file diff --git a/archive/index.php b/archive/index.php index 87d367c..26a0ad1 100644 --- a/archive/index.php +++ b/archive/index.php @@ -6,7 +6,7 @@ <?php $_ACTIVE = "archive"; require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/categories.php"; ?> <h2><?= l("Projects Archives", "Archives des projets") ?></h2> <div class="alert alert-secondary"> - <strong>Note : </strong>You may find more archived projects on <a href="https://github.com/Minteck-Archives">Minteck's GitHub archives</a>. + <strong>Note<?= l("", " ") ?>: </strong><?= l("You may find more archived projects on", "Vous pourriez trouver plus de vieux projets dans") ?> <a href="https://github.com/Minteck-Archives"><?= l("Minteck's GitHub archives", "les archives GitHub de Minteck") ?></a>. </div> <?php require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/archive/main.php"; ?> </div> diff --git a/blog/_article.php b/blog/_article.php index 1d25467..819d7b1 100644 --- a/blog/_article.php +++ b/blog/_article.php @@ -15,18 +15,18 @@ if (!file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $_GET['i'] $data = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $_GET['i'] . ".json"), true); $article = $_GET['i']; -$_TITLE = $data["title"]; +$_TITLE = l($data["title"], $data["title.fr"] ?? $data["title"]); require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/header.php"; ?> <div style="margin-top: 56px;z-index: 5;background: #fff;padding-top: 20px;min-height: calc(100vh - 57px);" id="main-box"> <div class="container"> - <h2><?= $data["title"] ?></h2> - <h6 class="text-muted"><?= l("Published", "Publié") ?> <?= DateTime::createFromFormat('Y-m-d', explode("@", $article)[0])->format("F jS, Y"); ?></h6> + <h2><?= l($data["title"], $data["title.fr"] ?? $data["title"]) ?></h2> + <h6 class="text-muted"><?= l("Published", "Publié") ?> <?= strftime(l("%a %b %e, %Y", "%a %e %b %Y"), (int)DateTime::createFromFormat('Y-m-d', explode("@", $article)[0])->format("U")); ?></h6> <hr> <div> - <?= file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $_GET['i'] . ".json.html") ?> + <?= l(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $_GET['i'] . ".json.html"), file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $_GET['i'] . ".json.fr.html") ? file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $_GET['i'] . ".json.fr.html") : file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $_GET['i'] . ".json.html")) ?> </div> <hr> diff --git a/blog/index.php b/blog/index.php index 9e63e02..203e1ba 100644 --- a/blog/index.php +++ b/blog/index.php @@ -6,7 +6,7 @@ <div class="container"> <h2><?= l("All blog articles", "Tous les articles du blog") ?></h2> <div class="alert alert-secondary"> - <strong>Note :</strong> If you want a more generally tech-centric blog that doesn't necessarily talk about me, you should check out <a target="_blank" href="https://unchainedtech.minteck.ro.lt">UnchainedTech</a>, that is also accessible <a href="http://blgchnxuwuxqwclt247g6d4sxun4w3cqohkwgtjmckb6nbzu2pfssvyd.onion/">here</a> if you are using the Tor network. + <strong>Note<?= l("", " "); ?>:</strong> <?= l("If you want a more generally tech-centric blog that doesn't necessarily talk about me, you should check out", "Si vous voulez un blog plus centré sur la technologie qui ne parle pas nécessairement de moi, vous devriez regarder") ?> <a target="_blank" href="https://unchainedtech.minteck.ro.lt">UnchainedTech</a><?= l(", ", " (en anglais), ") ?><?= l("that is also available", "qui est aussi disponible") ?> <a href="http://blgchnxuwuxqwclt247g6d4sxun4w3cqohkwgtjmckb6nbzu2pfssvyd.onion/"><?= l("here", "ici"); ?></a> <?= l("if you are using the Tor network.", "si vous utilisez le réseau Tor.") ?> </div> <?php require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/blog/list.php"; ?> diff --git a/contact/index.php b/contact/index.php index 8b4cce0..e2da9e4 100644 --- a/contact/index.php +++ b/contact/index.php @@ -17,10 +17,10 @@ <ul> <li><b><img alt="" src="/static/contacts/email.png" class="os-logo"> Email</b> — <a href="mailto:nekostarfan@gmail.com" target="_blank">nekostarfan@gmail.com</a></li> - <li><b><img alt="" src="/static/contacts/email.png" class="os-logo"> Email</b> — <a href="mailto:minteckthefurry@protonmail.com" target="_blank">minteckthefurry@protonmail.com</a> — slow to answer, recommended to report security flaws (encrypted)</li> + <li><b><img alt="" src="/static/contacts/email.png" class="os-logo"> Email</b> — <a href="mailto:minteckthefurry@protonmail.com" target="_blank">minteckthefurry@protonmail.com</a> — <?= l("slow to answer, recommended to report security flaws (encrypted)", "long à répondre, recommandé pour signaler des failles de sécurité (chiffré)") ?></li> <li><b><img alt="" src="/static/contacts/twitter.png" class="os-logo"> Twitter</b> — <a href="https://twitter.com/_Minteck" target="_blank">@_Minteck</a> — DMs open!</li> <li><b><img alt="" src="/static/contacts/reddit.png" class="os-logo"> Reddit</b> — <a href="https://reddit.com/u/Minteck" target="_blank">u/Minteck</a> — DMs open!</li> - <li><b><img alt="" src="/static/contacts/discord.png" class="os-logo"> Discord</b> — @Minteck#2245 — please contact only if we're friends</li> + <li><b><img alt="" src="/static/contacts/discord.png" class="os-logo"> Discord</b> — @Minteck#2245 — <?= l("please contact only if we're friends", "merci de me contacter uniquement si nous sommes amis") ?></li> <li><b><img alt="" src="/static/contacts/youtube.png" class="os-logo"> YouTube</b> — <a href="https://www.youtube.com/channel/UCfjxe9cs-ovoP1rBVwdMq0Q" target="_blank">Minteck</a></li> <li><b><img alt="" src="/static/contacts/music.png" class="os-logo"> YouTube Music</b> — <a href="https://music.youtube.com/channel/UCfjxe9cs-ovoP1rBVwdMq0Q" target="_blank">Minteck</a></li> <li><b><img alt="" src="/static/contacts/soundcloud.png" class="os-logo"> SoundCloud</b> — <a href="https://soundcloud.com/minteck" target="_blank">Minteck</a></li> @@ -31,7 +31,55 @@ </ul> <h2><?= l("Artworks credit", "Crédits des dessins") ?></h2> - TODO: Do the thing + <div id="artwork-credits"> + <?= credit("Minteck", l("<p>Artwork by me, original design by <a href='https://twitter.com/Blayris6' target='_blank'>Blayris6</a> and Retsuno</p>", "<p>Dessin par moi, dessin original par <a href='https://twitter.com/Blayris6' target='_blank'>Blayris6</a> et Retsuno</p>"), "/static/credits/minteck.png", false) ?> + <?= credit("Retsuno", l("<p>Artwork by me, original design by Retsuno</p>", "<p>Dessin par moi, dessin original par Retsuno</p>"), "/static/credits/retsuno.png", true) ?> + <?= credit("YonKaGor", l("<p>Artwork by me, original design by <a href='https://twitter.com/YonKaGor' target='_blank'>YonKaGor</a></p>", "<p>Dessin par moi, dessin original par <a href='https://twitter.com/YonKaGor' target='_blank'>YonKaGor</a></p>"), "/static/credits/yonkagor.png", false) ?> + <?= credit("Wishdream", l("<p>Artwork by me, original design by <a href='https://twitter.com/WishdreamStar' target='_blank'>WishdreamStar</a></p>", "<p>Dessin par moi, dessin original par <a href='https://twitter.com/WishdreamStar' target='_blank'>WishdreamStar</a></p>"), "/static/credits/wishdream.png", true) ?> + <?= credit("Fleur", l("<p>Artwork by me, original design by <a href='https://twitter.com/Fleurfurr' target='_blank'>Fleurfurr</a></p>", "<p>Dessin par moi, dessin original par <a href='https://twitter.com/Fleurfurr' target='_blank'>Fleurfurr</a></p>"), "/static/credits/fleur.png", false) ?> + <?= credit("fiddle", l("<p>Artwork by me, original design by <a href='https://twitter.com/fiddle' target='_blank'>fiddle</a></p>", "<p>Dessin par moi, dessin original par <a href='https://twitter.com/fiddle' target='_blank'>fiddle</a></p>"), "/static/credits/fiddle.png", true) ?> + </div> + <p style="text-align:center;"> + <?= l("Homepage banner, profile picture, and footer banner are all done by me, based on work from the aforementioned people.", "La bannière de la page d'accueil, la photo de profil, et la bannière du pied de page sont tous faits par moi, basé sur le travail des personnes mentionnées ci-dessus.") ?> + </p> + <style> + #artwork-credits { + display: grid; + grid-template-columns: 1fr 1fr; + } + + .artwork-credits-image { + height: 25vh; + display: block; + margin-left: auto; + margin-right: 10px; + } + + .artwork-credits-box { + display: flex; + align-items: center; + margin-left: 10px; + } + + .artwork-credits-image--back { + height: 25vh; + display: block; + margin-right: auto; + margin-left: 10px; + } + + .artwork-credits-box--back { + display: flex; + align-items: center; + justify-content: right; + margin-right: 10px; + text-align: right; + } + + .artwork-credits-box--back > div { + width: 100%; + } + </style> </div> <br> diff --git a/creations/dev/neutron/index.php b/creations/dev/neutron/index.php new file mode 100644 index 0000000..0a9c6ba --- /dev/null +++ b/creations/dev/neutron/index.php @@ -0,0 +1,4 @@ +<?php + +header("Location: /creations/neutron"); +die();
\ No newline at end of file diff --git a/creations/index.php b/creations/index.php index d721404..3a36782 100644 --- a/creations/index.php +++ b/creations/index.php @@ -7,7 +7,7 @@ <h2><?= l("Creations", "Mes projets") ?></h2> <?php require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/projects/list.php"; ?><br> <p><a href="/archive"><?= l("More software on the archive page", "Plus de logiciels sur la page d'archives") ?></a></p> - <small><p class="text-muted">Some project links may redirect to GitHub or YouTube, which are external websites with their own policies.</p></small> + <small><p class="text-muted"><?= l("Some project links may redirect to GitHub or YouTube, which are external websites with their own policies.", "Certains liens de projets peuvent rediriger vers GitHub ou YouTube, qui sont des sites externes avec leurs propres politiques."); ?></p></small> </div> <br> diff --git a/creations/neutron/index.php b/creations/neutron/index.php index 309ebc1..2a26d32 100644 --- a/creations/neutron/index.php +++ b/creations/neutron/index.php @@ -1,12 +1,47 @@ <?php $_TITLE = "Neutron"; require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/header.php"; ?> <div style="margin-top: 56px;z-index: 5;background: #fff;padding-top: 20px;min-height: calc(100vh - 57px);" id="main-box"> + <div id="project-hero" style="background-image:url('/static/hero/neutron.jpg');"></div> + <div class="container"> <h2><?= l("Neutron, your future website designer", "Neutron, le futur designer de votre site Web") ?></h2> <p>Neutron is software created so that you can easily manage one or more websites without any required knowledge. Whether you are developer or not, Neutron is the best way to have a ready-to-go website.</p> <p>Neutron is released under the GNU General Public License version 3, which means you can contribute to the project and improve it.</p> - <h3>Download Neutron</h3> + <h3>Run Neutron on the cloud <span class="badge bg-secondary">New!</span></h3> + Neutron 10 introduces support for a new much wanted technology: Neutron Cloud. The concept is simple: <b>you create, we host</b>. Here are the 5 top points for choosing Neutron Cloud instead of using Neutron on-premises: + <ul> + <li><b>it's free, and will be forever</b>. You don't have to buy/rent a server to use Neutron. We think everyone deserve the right to have a private place where they can share their life.</li> + <li><b>forget the hassle</b>. You write your content, we take care of the rest.</li> + <li><b>always fresh and secure</b>. Your Neutron Cloud is always up-to-date with the latest development version of Neutron.</li> + <li><b>fast at large scales</b>. Neutron Cloud allows you to have at most 250 unique visitors per month, and they all will get the same level of performance.</li> + <li><b>share it</b>. Your Neutron Cloud website can get a custom shortened URL that you can share everywhere.</li> + </ul> + + <p>Neutron Cloud is currently available after registration on <b><a href="https://docs.google.com/forms/d/1ozcKpET3U42ZHw-XolwNVTOseyhlVxxqG9EG8xrkyaU/viewform">HERE</a></b>. We limit registration to prevent abuse and know how you intend to use your Neutron Cloud website. If you already have a website running Neutron on your own server, you can send us the files and we migrate your website!</p> + + <details> + <summary>Restrictions apply, click here to see</summary> + <ul> + <li>The Neutron Cloud service is reserved only for individuals and non-profit organizations. Select professional and commercial users may get access to Neutron Cloud.</li> + <li>Access to Neutron Cloud does not give additional support priority over regular Neutron users.</li> + <li>Website traffic is limited to 250 unique users (counted using IP address) per month</li> + <li>Website storage is soft-limited to 100 MiB; the website may be suspended if you exceed this limit</li> + <li>Minimal uptime is guaranteed according to the following schedule: + <ul> + <li>25% uptime on July and August (due to yearly maintenances)</li> + <li>80% uptime from March to May (due to maintenances)</li> + <li>85% uptime in June (due to high temperatures)</li> + <li>99% uptime from September to February</li> + <li>In case of an extended maintenance period, you will be notified on the email address you entered when you registered to Neutron Cloud.</li> + </ul></li> + </ul> + </details> + + <br> + + <h3>Run Neutron on your own hardware</h3> + <p>Download the package and put it in your Web server's root. You will need the Apache HTTP Server with at least PHP 7.4 and the GD library.</p> <div class="card-group"> <div class="card"> <div class="card-body" style="text-align: center;"> @@ -15,16 +50,16 @@ $releases = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/stats/neutron.json"), true); foreach ($releases as $release): - ?> - <?php if (!$release["prerelease"]): ?> - <h3><?= $release["tag_name"] ?></h3> - <h5>Latest Stable Release</h5> - <p><?= $release["name"] ?><br>Downstream from branch <code><?= $release["target_commitish"] ?></code></p> - <div class="btn-group"> - <a href="<?= $release["zipball_url"] ?>" class="btn btn-primary">Download</a> - <a href="https://github.com/Minteck-Projects/Neutron-Core/tree/<?= $release["tag_name"] ?>" class="btn btn-outline-primary">Browse code</a> - </div> - <?php break; endif; endforeach; ?> + ?> + <?php if (!$release["prerelease"]): ?> + <h3><?= $release["tag_name"] ?></h3> + <h5>Latest Stable Release</h5> + <p><?= $release["name"] ?><br>Downstream from branch <code><?= $release["target_commitish"] ?></code></p> + <div class="btn-group"> + <a href="<?= $release["zipball_url"] ?>" class="btn btn-primary">Download</a> + <a href="https://github.com/Minteck-Projects/Neutron-Core/tree/<?= $release["tag_name"] ?>" class="btn btn-outline-primary">Browse code</a> + </div> + <?php break; endif; endforeach; ?> </div> </div> <div class="card"> diff --git a/furry/index.php b/furry/index.php index b88930b..fa08d9b 100644 --- a/furry/index.php +++ b/furry/index.php @@ -7,7 +7,7 @@ <h2><?= l("I'm a furry, so what?", "Je suis un furry, alors ?") ?></h2> <p>I have been an active member of the furry fandom since February 2021, and by <i>"active"</i> I mean <i>"<u>really</u> active</i>: I read every tweet from furries I follow, I hang out on Reddit and I celebrate the fursuit friday every week (even though I don't own a fursuit).</p> - <p>I'm supported by and have supported many furries around the world, even by just saying things like <i>"This is cute"</i> or <i>"Keep it up!"</i> means a lot to people (and to me when they say thanks).</p> + <p>I'm supported by and have supported many furries around the world, even just saying things like <i>"This is cute"</i> or <i>"Keep it up!"</i> means a lot to people (and to me when they say thanks).</p> <p>The furry fandom helped me <a href="/social">make a lot of friends</a> that live everywhere on the planet; including some that I consider my best friends. I find it kind of amazing to chat with people without even knowing how they look like.</p> <p>My top goal in my <i>tiny furry life</i> is to go to <a href="https://eurofurence.org" target="_blank">Eurofurence</a> and maybe get me a fursuit someday, who knows?</p> <hr> diff --git a/includes/archive/main.php b/includes/archive/main.php index 4bd2cf7..28cb438 100644 --- a/includes/archive/main.php +++ b/includes/archive/main.php @@ -1,4 +1,4 @@ -<p>Download the old of the oldest software I made. Some of this software is <u>proprietary</u> and you can't change or distribute it without my consent. Active projects are not listed here and can be downloaded from their respective page.</p> +<p><?= l("Download the old of the oldest software I made", "Téléchargez les plus vieux des vieux logiciels que j'ai créé") ?>. <?= l("Some of this software is", "Certains de ces logiciels sont") ?> <u><?= l("proprietary", "propriétaires") ?></u> <?= l("and you can't change or distribute it without my consent", "et vous ne pouvez pas les modifier ou les distribuer sans mon accord") ?>. <?= l("Active projects are not listed here and can be downloaded from their respective page", "Les projets en cours de développement ne sont pas listés ici et peuvent être téléchargés sur leur page respective") ?>.</p> <div class="list-group"> <?php @@ -10,7 +10,7 @@ $data = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/archive/get/" . $file), true); echo('<a href="/archive/get/'.substr($file, 0, -5).'.zip" class="list-group-item list-group-item-action"><span class="badge bg-secondary rounded-pill">'.$data['date'].'</span> '.$data['title']); if ($data['unreleased']) { - echo(' <span class="badge bg-warning">Unreleased</span>'); + echo(' <span class="badge bg-warning">' . l("Unreleased", "Jamais sorti") . '</span>'); } echo('</a>'); } @@ -19,4 +19,4 @@ ?> </div> <br> -<small><p class="text-muted">Project start dates are estimated and cannot always be accurate</p></small>
\ No newline at end of file +<small><p class="text-muted"><?= l("Project start dates are estimated and cannot always be accurate", "Les dates de début des projets sont des estimations et ne peuvent pas être toujours précises") ?></p></small>
\ No newline at end of file diff --git a/includes/blog/data/2020-05-04@something4.json b/includes/blog/data/2020-05-04@something4.json index 51021ea..c8376de 100644 --- a/includes/blog/data/2020-05-04@something4.json +++ b/includes/blog/data/2020-05-04@something4.json @@ -1,3 +1,4 @@ { - "title": "Some article" + "title": "Some article", + "title.fr": "Un article" }
\ No newline at end of file diff --git a/includes/blog/data/2020-05-04@something4.json.fr.html b/includes/blog/data/2020-05-04@something4.json.fr.html new file mode 100644 index 0000000..8bb1663 --- /dev/null +++ b/includes/blog/data/2020-05-04@something4.json.fr.html @@ -0,0 +1 @@ +<b>Il s'agit d'un <i>test</i></b><u> ou, <i>en est-il un ?</i></u>... Nous ne saurons jamais si il devait vraiment y avoir du texte ou quelque chose d'autre ici. Nous ne saurons jamais si il devait vraiment y avoir du texte ou quelque chose d'autre ici. Nous ne saurons jamais si il devait vraiment y avoir du texte ou quelque chose d'autre ici. Nous ne saurons jamais si il devait vraiment y avoir du texte ou quelque chose d'autre ici. Nous ne saurons jamais si il devait vraiment y avoir du texte ou quelque chose d'autre ici. Nous ne saurons jamais si il devait vraiment y avoir du texte ou quelque chose d'autre ici. Nous ne saurons jamais si il devait vraiment y avoir du texte ou quelque chose d'autre ici. Nous ne saurons jamais si il devait vraiment y avoir du texte ou quelque chose d'autre ici. Nous ne saurons jamais si il devait vraiment y avoir du texte ou quelque chose d'autre ici. Nous ne saurons jamais si il devait vraiment y avoir du texte ou quelque chose d'autre ici. Nous ne saurons jamais si il devait vraiment y avoir du texte ou quelque chose d'autre ici.
\ No newline at end of file diff --git a/includes/blog/home.php b/includes/blog/home.php index a515c14..49817e8 100644 --- a/includes/blog/home.php +++ b/includes/blog/home.php @@ -10,13 +10,17 @@ <?php if ($i <= 3 && strpos($article, "@") !== false && strpos($article, ".html") === false): ?> <?php $data = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $article), true); - $data['html'] = file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $article . ".html"); + if (l("a", "b") === "b" && file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $article . ".fr.html")) { + $data['html'] = file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $article . ".fr.html"); + } else { + $data['html'] = file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $article . ".html"); + } ?> <div class="card"> <div class="card-body"> - <h5 class="card-title"><?= $data["title"] ?></h5> + <h5 class="card-title"><?= l($data["title"], $data["title.fr"] ?? $data["title"]) ?></h5> <p class="card-text"><?= strlen(strip_tags($data["html"])) > 150 ? substr(strip_tags($data["html"]), 0, 150) . "..." : strip_tags($data["html"]) ?></p> - <p class="card-text"><small class="text-muted"><?= l("Published", "Publié") ?> <?= DateTime::createFromFormat('Y-m-d', explode("@", $article)[0])->format("F jS, Y"); ?></small></p> + <p class="card-text"><small class="text-muted"><?= l("Published", "Publié") ?> <?= strftime(l("%a %b %e, %Y", "%a %e %b %Y"), (int)DateTime::createFromFormat('Y-m-d', explode("@", $article)[0])->format("U")); ?></small></p> <a href="/blog/article-<?= explode(".", $article)[0] ?>" class="card-link"><?= l("Read more...", "Lire plus...") ?></a> </div> </div> diff --git a/includes/blog/list.php b/includes/blog/list.php index ba859a2..1c81630 100644 --- a/includes/blog/list.php +++ b/includes/blog/list.php @@ -9,7 +9,7 @@ ?> <?php if (strpos($article, "@") !== false && strpos($article, ".html") === false): ?> <?php $data = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/blog/data/" . $article), true); ?> - <a href="/blog/article-<?= explode(".", $article)[0] ?>" class="list-group-item list-group-item-action"><span class="text-muted"><?= DateTime::createFromFormat('Y-m-d', explode("@", $article)[0])->format("F jS, Y"); ?></span> · <?= $data["title"] ?></a> + <a href="/blog/article-<?= explode(".", $article)[0] ?>" class="list-group-item list-group-item-action"><span class="text-muted"><?= strftime(l("%a %b %e, %Y", "%a %e %b %Y"), (int)DateTime::createFromFormat('Y-m-d', explode("@", $article)[0])->format("U")); ?></span> · <?= l($data["title"], $data["title.fr"] ?? $data["title"]) ?></a> <?php endif;$i++; ?> <?php endforeach; ?> </div>
\ No newline at end of file diff --git a/includes/friends/home.php b/includes/friends/home.php index d23c37a..e549070 100644 --- a/includes/friends/home.php +++ b/includes/friends/home.php @@ -4,14 +4,14 @@ <!--suppress CssInvalidPropertyValue --> <h5 class="card-title" style="font-weight: bold;background: radial-gradient(circle,#dec64c 0%,#d67541 100%);background-clip: text;-webkit-background-clip: text;-webkit-text-fill-color: transparent;">Retsuno</h5> <h6 class="card-subtitle mb-2 text-muted"> </h6> - <p>We met by chance on Reddit and now we're best friends. Was the first furry I talked to after <i>really</i> joining the fandom (yes, at 1 AM).</p> + <p><?= l("We met by chance on Reddit and now we're best friends. Was the first furry I talked to after <i>really</i> joining the fandom (yes, at 1 AM).", "Nous nous sommes rencontrés par hasard sur Reddit et maintenant nous sommes meilleurs amis. Il a été le premier furry auquel j'ai parlé après avoir <i>réellement</i> rejoint le fandom (oui, à 1h du matin)"); ?></p> </div> </div> <div class="card"> <div class="card-body"> <h5 class="card-title">Mylo</h5> <h6 class="card-subtitle mb-2 text-muted">@FENNECPARTY</h6> - <p>His photos are great, and the person behind them is awesome.</p> + <p><?= l("His photos are great, and the person behind them is awesome.", "Ses photos sont jolies, et la personne derrière est incroyable."); ?></p> <a href="https://twitter.com/fennecparty" target="_blank" class="btn btn-primary">Twitter</a> </div> </div> @@ -19,7 +19,7 @@ <div class="card-body"> <h5 class="card-title">Fleur</h5> <h6 class="card-subtitle mb-2 text-muted">@Fleurfurr</h6> - <p>(Somehow we're friends on Discord, don't remember sending you a request... ^^) His art is good and with little details everywhere!</p> + <p><?= l("(Somehow we're friends on Discord, don't remember sending you a request... ^^) His art is good and with little details everywhere!", "(Apparement nous sommes amis sur Discord, je ne me souviens pas t'avoir envoyé de demande... ^^) Son art est beau et avec des petits détails partout !"); ?></p> <a href="https://twitter.com/Fleurfurr" target="_blank" class="btn btn-primary">Twitter</a> </div> </div> @@ -27,7 +27,7 @@ <div class="card-body"> <h5 class="card-title">Ayann</h5> <h6 class="card-subtitle mb-2 text-muted">@ayann_fr</h6> - <p>Helped me keep all this up with mental fuel! Probably won't be there without him.</p> + <p><?= l("Helped me keep all this up with mental fuel! Probably won't be there without him.", "M'a aidé à continuer mes efforts avec des messages de soutien ! Je ne serai probablement pas là sans lui."); ?></p> <a href="https://twitter.com/ayann_fr" target="_blank" class="btn btn-primary">Twitter</a> </div> </div> @@ -37,7 +37,7 @@ <div class="card-body"> <h5 class="card-title">Wishdream</h5> <h6 class="card-subtitle mb-2 text-muted">@WishdreamStar</h6> - <p>Probably knows Linux as much as I know it. Very fun and interesting to talk to each other, and also very great art.</p> + <p><?= l("Probably knows Linux as much as I know it. Very fun and interesting to talk to each other, and also very great art.", "Connaît probablement Linux autant que je le connais. Il est très amusant et intéressant de discuter ensemble, et aussi son art est joli."); ?></p> <a href="https://twitter.com/WishdreamStar" target="_blank" class="btn btn-primary">Twitter</a> </div> </div> @@ -45,7 +45,7 @@ <div class="card-body"> <h5 class="card-title">Brabbit</h5> <h6 class="card-subtitle mb-2 text-muted">@TalkingTadPol</h6> - <p>We mutually supported each other during hard times without even knowing each other. What an amazing story!</p> + <p><?= l("We mutually supported each other during hard times without even knowing each other. What an amazing story!", "On se soutient mutuellement pendant des temps difficiles sans même se connaître. Quelle histoire incroyable !"); ?></p> <a href="https://twitter.com/TalkingTadPol" target="_blank" class="btn btn-primary">Twitter</a> </div> </div> @@ -53,7 +53,7 @@ <div class="card-body"> <h5 class="card-title">fiddle</h5> <h6 class="card-subtitle mb-2 text-muted">@fiddleafox</h6> - <p>We are friends. Or are we? Who knows... We talked about <a href="/creations/kartik">Kartik</a> a while back so maybe yes.</p> + <p><?= l("We are friends. Or are we? Who knows... We talked about <a href='/creations/kartik'>Kartik</a> a while back so maybe yes.", "Nous sommes amis. Ou sommes nous amis ? Qui sait... On a discuté de <a href='/creations/kartik'>Kartik</a> il y a quelques temps donc probablement."); ?></p> <a href="https://twitter.com/TalkingTadPol" target="_blank" class="btn btn-primary">Twitter</a> </div> </div> @@ -61,7 +61,7 @@ <div class="card-body"> <h5 class="card-title">russelbuck</h5> <h6 class="card-subtitle mb-2 text-muted">@russelbuck</h6> - <p>Meaningful music that I enjoy listening to. I did a cover of <a href="/creations/gyrate-with-obliqueness">Gyrate with Obliqueness</a> from them.</p> + <p><?= l("Meaningful music that I enjoy listening to. I did a cover of <a href='/creations/gyrate-with-obliqueness'>Gyrate with Obliqueness</a> from them.", "Musique censée à laquelle j'adore écouter. J'ai fait une reprise de sa musique <a href='/creations/gyrate-with-obliqueness'>Gyrate with Obliqueness</a>."); ?></p> <a href="https://twitter.com/russelbuck" target="_blank" class="btn btn-primary">Twitter</a> </div> </div> diff --git a/includes/header.php b/includes/header.php index ea8fb50..3f16582 100644 --- a/includes/header.php +++ b/includes/header.php @@ -2,16 +2,52 @@ $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); -function l($en, $fr) { +function l($en, $fr = null) { global $lang; - if (($lang === "fr" && isset($fr)) || isset($_GET['fr'])) { + if ((($lang === "fr" && isset($fr)) || (isset($_GET['fr']) && isset($fr) || isset($_COOKIE['fr']))) && !isset($_GET['en']) && !isset($_COOKIE['en']) && isset($fr)) { + setlocale(LC_TIME, array('fr_FR.UTF-8','fr_FR@euro','fr_FR','french')); return $fr; } else { return $en; } } +$db = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/telemetry.json"), true); + +$ip = md5($_SERVER['REMOTE_ADDR']); +$day = date('d'); +$month = date('m'); +$year = date('y'); +$url = explode("?", $_SERVER['REQUEST_URI'])[0]; + +if (!isset($db[$year])) { + $db[$year] = []; +} +if (!isset($db[$year][$month])) { + $db[$year][$month] = []; +} +if (!isset($db[$year][$month][$day])) { + $db[$year][$month][$day] = []; +} +if (!isset($db[$year][$month][$day][$url])) { + $db[$year][$month][$day][$url] = []; +} + +if (!in_array($ip, $db[$year][$month][$day][$url])) { + array_push($db[$year][$month][$day][$url], $ip); +} + +function credit(string $name, string $description, string $image, bool $backwards) { + if ($backwards) { + return "<div class='artwork-credits-box--back'><div><h3>{$name}</h3>{$description}</div></div><img class='artwork-credits-image--back' src='{$image}' alt='{$name}'>"; + } else { + return "<img class='artwork-credits-image' src='{$image}' alt='{$name}'><div class='artwork-credits-box'><div><h3>{$name}</h3>{$description}</div></div>"; + } +} + +file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/telemetry.json", json_encode($db, JSON_PRETTY_PRINT)); + ?> <!DOCTYPE html> <html lang="<?= $lang === "fr" ? "fr" : "en" ?>"> @@ -20,6 +56,7 @@ function l($en, $fr) { <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" href="/logo.svg"> <link href="/static/css/darktheme.css" rel="stylesheet"> + <link href="/static/css/fonts" rel="stylesheet"> <link href="/static/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> <title><?php @@ -30,8 +67,8 @@ function l($en, $fr) { ?><?= l("Minteck's space", "L'espace de Minteck") ?></title> </head> <body style="background-size: cover;background-position: center;background-repeat: no-repeat;background-attachment: fixed;"> - <div style="height:24px;background:orange;position:fixed;color:black;text-align:center;z-index:999;top:0;left:0;right:0;">Private beta of Minteck's space. Please report all bugs, issues or design details at <a href="mailto:nekostarfan@gmail.com">nekostarfan@gmail.com</a> or <a href="https://jetbrains.minteck.ro.lt:1024/youtrack/issues/MSS" target="_blank">on Minteck's YouTrack instance</a></div> - <nav class="navbar fixed-top navbar-expand-lg navbar-light bg-light" style="margin-top:24px;"> + <!--<div style="height:16px;background:orange;position:fixed;color:black;font-size:12px;font-weight:bold;text-align:center;z-index:999;top:0;left:0;right:0;">Private beta of Minteck's space. Please report all bugs, issues or design details at <a href="mailto:nekostarfan@gmail.com">nekostarfan@gmail.com</a> or <a href="https://jetbrains.minteck.ro.lt:1024/youtrack/issues/MSS" target="_blank">on Minteck's YouTrack instance</a></div>--> + <nav style="z-index:99;" class="navbar fixed-top navbar-expand-lg navbar-light bg-light"> <div class="container-fluid"> <a class="navbar-brand" href="/"><img src="/logo.svg" alt="" width="36px"> <span style="vertical-align: middle;"><?= l("Minteck's space", "L'espace de Minteck") ?></span></a> <button class="navbar-toggler" style="filter:invert(1);" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> diff --git a/includes/projects/home.php b/includes/projects/home.php index 743adc1..2f11b33 100644 --- a/includes/projects/home.php +++ b/includes/projects/home.php @@ -1,5 +1,5 @@ <div class="list-group"> - <a href="/creations/kartik" class="list-group-item list-group-item-action"><img src="<?= trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/creations/dev/kartik/icon.txt")) ?>" alt="" width="24px"> Kartik <span class="badge bg-secondary rounded-pill">Development</span></a> - <a href="/creations/neutron" class="list-group-item list-group-item-action"><img src="<?= trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/creations/dev/neutron/icon.txt")) ?>" alt="" width="24px"> Neutron <span class="badge bg-secondary rounded-pill">Development</span></a> - <a href="/creations/gyrate-with-obliqueness" class="list-group-item list-group-item-action"><img src="/static/genericProjectIcon.png" alt="" width="24px"> Gyrate with Obliqueness <span class="badge bg-secondary rounded-pill">Multimedia</span></a> + <a href="/creations/kartik" class="list-group-item list-group-item-action"><img src="<?= trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/creations/kartik/icon.txt")) ?>" alt="" width="24px"> Kartik <span class="badge bg-secondary rounded-pill"><?= l("Development", "Programmation") ?></span></a> + <a href="/creations/neutron" class="list-group-item list-group-item-action"><img src="<?= trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/creations/neutron/icon.txt")) ?>" alt="" width="24px"> Neutron <span class="badge bg-secondary rounded-pill"><?= l("Development", "Programmation") ?></span></a> + <a href="/creations/gyrate-with-obliqueness" class="list-group-item list-group-item-action"><img src="/static/genericProjectIcon.png" alt="" width="24px"> Gyrate with Obliqueness <span class="badge bg-secondary rounded-pill"><?= l("Multimedia", "Multimédia") ?></span></a> </div>
\ No newline at end of file diff --git a/includes/projects/list.php b/includes/projects/list.php index 00c27d0..136cf56 100644 --- a/includes/projects/list.php +++ b/includes/projects/list.php @@ -7,7 +7,7 @@ ?> <?php if (trim($article) !== "." && trim($article) !== ".." && trim($article) !== "dev" && trim($article) !== "video" && is_dir($_SERVER['DOCUMENT_ROOT'] . "/creations/" . $article)): ?> - <a href="/creations/<?= $article ?>" class="list-group-item list-group-item-action"><img src="<?= trim(file_exists($_SERVER['DOCUMENT_ROOT'] . "/creations/" . $article . "/icon.txt") ? file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/creations/" . $article . "/icon.txt") : "/static/genericProjectIcon.png") ?>" width="24px" alt=""> <?= file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/creations/" . $article . "/title.txt") ?><span class="text-muted"> · <?= file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/creations/" . $article . "/description.txt") ?></span></a> + <a href="/creations/<?= $article ?>" class="list-group-item list-group-item-action"><img src="<?= trim(file_exists($_SERVER['DOCUMENT_ROOT'] . "/creations/" . $article . "/icon.txt") ? file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/creations/" . $article . "/icon.txt") : "/static/genericProjectIcon.png") ?>" width="24px" alt=""> <?= file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/creations/" . $article . "/title.txt") ?><span class="text-muted"> · <?= l(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/creations/" . $article . "/description.txt"), file_exists($_SERVER['DOCUMENT_ROOT'] . "/creations/" . $article . "/description.fr.txt") ? file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/creations/" . $article . "/description.fr.txt") : file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/creations/" . $article . "/description.txt")) ?></span></a> <?php endif;$i++; ?> <?php endforeach; ?> </div>
\ No newline at end of file @@ -37,8 +37,8 @@ <div style="background:white;padding-top:20px;z-index:5;" id="main-box"> <div class="container"> <div class="card-group"> - <div class="card" style="text-align:center;padding-top:20px;padding-bottom:10px;"> - <img class="card-img-top" src="/static/icons/furry-dark.png" alt="Card image" style="width:64px;height:64px;text-align:center;margin-left:auto;margin-right:auto;"> + <div class="card <?= isset($_ACTIVE) && $_ACTIVE === "furry" ? "bg-dark text-white" : "" ?>" style="text-align:center;padding-top:20px;padding-bottom:10px;"> + <img class="card-img-top" src="/static/icons/furry<?= !isset($_ACTIVE) || $_ACTIVE !== "furry" ? "" : "-dark" ?>.png" alt="Card image" style="width:64px;height:64px;text-align:center;margin-left:auto;margin-right:auto;"> <div class="card-body"> <h3><?= l("Furry fandom", "Fandom furry") ?></h3> <p><?= l("I am active in the furry community (also made a lot of friends there)", "Je suis actif dans la communauté furry (je me suis fait plein d'amis là bas)") ?></p> @@ -46,26 +46,20 @@ <a href="/furry" class="card-link"><?= l("Learn more...", "En savoir plus...") ?></a> </div> </div> - <div class="card" style="text-align:center;padding-top:20px;padding-bottom:10px;"> - <img class="card-img-top" src="/static/icons/code-dark.png" alt="Card image" style="width:64px;height:64px;text-align:center;margin-left:auto;margin-right:auto;"> - <div class="card-body"> - <h3><?= l("Development", "Programmation") ?></h3> - <p><?= l("I have been developing software and stuff for a really long time", "Je développe des logiciels et des petits trucs depuis très longtemps") ?></p> - - <a href="/creations/dev" class="card-link"><?= l("Learn more...", "En savoir plus...") ?></a> + <div class="card <?= isset($_ACTIVE) && ($_ACTIVE === "dev" || $_ACTIVE === "video") ? "bg-dark text-white" : "" ?>" style="text-align:center;padding-top:20px;padding-bottom:10px;"> + <div style="text-align:center;margin-left:auto;margin-right:auto;" class="card-img-top"> + <img src="/static/icons/code<?= !isset($_ACTIVE) || ($_ACTIVE !== "dev" && $_ACTIVE !== "video") ? "" : "-dark" ?>.png" alt="Card image" style="width:64px;height:64px;text-align:center;margin-left:auto;margin-right:auto;"> + <img src="/static/icons/media<?= !isset($_ACTIVE) || ($_ACTIVE !== "dev" && $_ACTIVE !== "video") ? "" : "-dark" ?>.png" alt="Card image" style="width:64px;height:64px;"> </div> - </div> - <div class="card" style="text-align:center;padding-top:20px;padding-bottom:10px;"> - <img class="card-img-top" src="/static/icons/media-dark.png" alt="Card image" style="width:64px;height:64px;text-align:center;margin-left:auto;margin-right:auto;"> <div class="card-body"> - <h3><?= l("Multimedia", "Audiovisuel") ?></h3> - <p><?= l("For 10 years now, I have been making videos and other multimedia content", "Depuis plus de 10 ans maintenant je fais des vidéos et d'autre style de contenu multimédia") ?></p> + <h3><?= l("Projects", "Projets") ?></h3> + <p><?= l("Developing software and making multimedia stuff is my passion", "Mon passe-temps est de coder des logiciels et de créer du contenu multimedia") ?></p> - <a href="/creations/video" class="card-link"><?= l("Learn more...", "En savoir plus...") ?></a> + <a href="/creations" class="card-link"><?= l("Learn more...", "En savoir plus...") ?></a> </div> </div> - <div class="card" style="text-align:center;padding-top:20px;padding-bottom:10px;"> - <img class="card-img-top" src="/static/icons/archive-dark.png" alt="Card image" style="width:64px;height:64px;text-align:center;margin-left:auto;margin-right:auto;"> + <div class="card <?= isset($_ACTIVE) && $_ACTIVE === "archive" ? "bg-dark text-white" : "" ?>" style="text-align:center;padding-top:20px;padding-bottom:10px;"> + <img class="card-img-top" src="/static/icons/archive<?= !isset($_ACTIVE) || $_ACTIVE !== "archive" ? "" : "-dark" ?>.png" alt="Card image" style="width:64px;height:64px;text-align:center;margin-left:auto;margin-right:auto;"> <div class="card-body"> <h3>Archives</h3> <p><?= l("I give everyone the possibility to enjoy all my projects, from past to the future", "Je donne à tout le monde la possibilité d'apprécier mes projets, du passé au futur") ?></p> @@ -74,7 +68,6 @@ </div> </div> </div> - <hr> <h2 style="margin-top:25px;"><?= l("100% Serious Projects", "Projets 100% sérieux") ?></h2> diff --git a/static/credits/fiddle.png b/static/credits/fiddle.png Binary files differnew file mode 100644 index 0000000..8f0cb48 --- /dev/null +++ b/static/credits/fiddle.png diff --git a/static/credits/fleur.png b/static/credits/fleur.png Binary files differnew file mode 100644 index 0000000..82f7c3a --- /dev/null +++ b/static/credits/fleur.png diff --git a/static/credits/minteck.png b/static/credits/minteck.png Binary files differnew file mode 100644 index 0000000..25a4b59 --- /dev/null +++ b/static/credits/minteck.png diff --git a/static/credits/retsuno.png b/static/credits/retsuno.png Binary files differnew file mode 100644 index 0000000..6f23c9c --- /dev/null +++ b/static/credits/retsuno.png diff --git a/static/credits/wishdream.png b/static/credits/wishdream.png Binary files differnew file mode 100644 index 0000000..48a2c4e --- /dev/null +++ b/static/credits/wishdream.png diff --git a/static/credits/yonkagor.png b/static/credits/yonkagor.png Binary files differnew file mode 100644 index 0000000..68d7073 --- /dev/null +++ b/static/credits/yonkagor.png diff --git a/static/css/fonts/index.php b/static/css/fonts/index.php new file mode 100644 index 0000000..f855ee5 --- /dev/null +++ b/static/css/fonts/index.php @@ -0,0 +1,83 @@ +<?php + +header("Content-Type: text/css"); + +/* + * @font-face { + src: url("/static/fonts/Jost-Black.ttf"); + font-family: "Jost"; + font-style: normal; + font-weight: 900; +} + */ + +function css($name, $weight, $weightId, $style) { + if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/static/fonts/{$name}-{$weight}.ttf")) { + return "\n@font-face {\n src: url(\"/static/fonts/{$name}-{$weight}.ttf\");\n font-family: \"{$name}\";\n font-style: {$style};\n font-weight: {$weightId};\n}\n"; + } +} + +function font(string $name) { + $txt = ""; + + // 100 - Thin + $txt .= css($name, "Thin", 100, "normal"); + $txt .= css($name, "ThinItalic", 100, "italic"); + + // 200 - Extra Light + $txt .= css($name, "ExtraLight", 200, "normal"); + $txt .= css($name, "ExtraLightItalic", 200, "italic"); + + // 300 - Light + $txt .= css($name, "Light", 300, "normal"); + $txt .= css($name, "LightItalic", 300, "italic"); + + // 400 - Regular + $txt .= css($name, "Italic", 400, "italic"); + $txt .= css($name, "Regular", 400, "normal"); + + // 500 - Medium + $txt .= css($name, "Medium", 500, "normal"); + $txt .= css($name, "MediumItalic", 500, "italic"); + + // 600 - Semi-bold + $txt .= css($name, "SemiBold", 600, "normal"); + $txt .= css($name, "SemiBoldItalic", 600, "italic"); + + // 700 - Bold + $txt .= css($name, "Bold", 700, "normal"); + $txt .= css($name, "BoldItalic", 700, "italic"); + + // 800 - Extra Bold + $txt .= css($name, "ExtraBold", 800, "normal"); + $txt .= css($name, "ExtraBoldItalic", 800, "italic"); + + // 900 - Black + $txt .= css($name, "Black", 900, "normal"); + $txt .= css($name, "BlackItalic", 900, "normal"); + + return $txt; +} + +?> + +/* Generated on <?= date('r') ?> */ +<?= font("Jost") ?> +<?= font("MavenPro") ?> +<?= font("Overpass") ?> + +:root { + --bs-font-sans-serif: "MavenPro","Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji",system-ui,-apple-system !important; +} + +html, body { + font-family: "MavenPro","Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji",system-ui,-apple-system !important; +} + +body.admin { + font-family: "Overpass","Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji",system-ui,-apple-system !important; +} + +h1, h2, h3, h4, h5, h6, .display-1, .display-2, .display-3, .display-4, .display-5, .display-6 { + font-family: "Jost","Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji",system-ui,-apple-system; +}
\ No newline at end of file diff --git a/static/fonts/Jost-Black.ttf b/static/fonts/Jost-Black.ttf Binary files differnew file mode 100644 index 0000000..c507e24 --- /dev/null +++ b/static/fonts/Jost-Black.ttf diff --git a/static/fonts/Jost-BlackItalic.ttf b/static/fonts/Jost-BlackItalic.ttf Binary files differnew file mode 100644 index 0000000..ad77c6a --- /dev/null +++ b/static/fonts/Jost-BlackItalic.ttf diff --git a/static/fonts/Jost-Bold.ttf b/static/fonts/Jost-Bold.ttf Binary files differnew file mode 100644 index 0000000..f291dd5 --- /dev/null +++ b/static/fonts/Jost-Bold.ttf diff --git a/static/fonts/Jost-BoldItalic.ttf b/static/fonts/Jost-BoldItalic.ttf Binary files differnew file mode 100644 index 0000000..9be42ef --- /dev/null +++ b/static/fonts/Jost-BoldItalic.ttf diff --git a/static/fonts/Jost-ExtraBold.ttf b/static/fonts/Jost-ExtraBold.ttf Binary files differnew file mode 100644 index 0000000..e9f2a17 --- /dev/null +++ b/static/fonts/Jost-ExtraBold.ttf diff --git a/static/fonts/Jost-ExtraBoldItalic.ttf b/static/fonts/Jost-ExtraBoldItalic.ttf Binary files differnew file mode 100644 index 0000000..649cb5b --- /dev/null +++ b/static/fonts/Jost-ExtraBoldItalic.ttf diff --git a/static/fonts/Jost-ExtraLight.ttf b/static/fonts/Jost-ExtraLight.ttf Binary files differnew file mode 100644 index 0000000..dfe7918 --- /dev/null +++ b/static/fonts/Jost-ExtraLight.ttf diff --git a/static/fonts/Jost-ExtraLightItalic.ttf b/static/fonts/Jost-ExtraLightItalic.ttf Binary files differnew file mode 100644 index 0000000..79843cd --- /dev/null +++ b/static/fonts/Jost-ExtraLightItalic.ttf diff --git a/static/fonts/Jost-Italic.ttf b/static/fonts/Jost-Italic.ttf Binary files differnew file mode 100644 index 0000000..4e233c4 --- /dev/null +++ b/static/fonts/Jost-Italic.ttf diff --git a/static/fonts/Jost-Light.ttf b/static/fonts/Jost-Light.ttf Binary files differnew file mode 100644 index 0000000..1675636 --- /dev/null +++ b/static/fonts/Jost-Light.ttf diff --git a/static/fonts/Jost-LightItalic.ttf b/static/fonts/Jost-LightItalic.ttf Binary files differnew file mode 100644 index 0000000..bab6af1 --- /dev/null +++ b/static/fonts/Jost-LightItalic.ttf diff --git a/static/fonts/Jost-Medium.ttf b/static/fonts/Jost-Medium.ttf Binary files differnew file mode 100644 index 0000000..0a23628 --- /dev/null +++ b/static/fonts/Jost-Medium.ttf diff --git a/static/fonts/Jost-MediumItalic.ttf b/static/fonts/Jost-MediumItalic.ttf Binary files differnew file mode 100644 index 0000000..0ea5fac --- /dev/null +++ b/static/fonts/Jost-MediumItalic.ttf diff --git a/static/fonts/Jost-Regular.ttf b/static/fonts/Jost-Regular.ttf Binary files differnew file mode 100644 index 0000000..5ec5625 --- /dev/null +++ b/static/fonts/Jost-Regular.ttf diff --git a/static/fonts/Jost-SemiBold.ttf b/static/fonts/Jost-SemiBold.ttf Binary files differnew file mode 100644 index 0000000..49c91c3 --- /dev/null +++ b/static/fonts/Jost-SemiBold.ttf diff --git a/static/fonts/Jost-SemiBoldItalic.ttf b/static/fonts/Jost-SemiBoldItalic.ttf Binary files differnew file mode 100644 index 0000000..7c5722d --- /dev/null +++ b/static/fonts/Jost-SemiBoldItalic.ttf diff --git a/static/fonts/Jost-Thin.ttf b/static/fonts/Jost-Thin.ttf Binary files differnew file mode 100644 index 0000000..374823d --- /dev/null +++ b/static/fonts/Jost-Thin.ttf diff --git a/static/fonts/Jost-ThinItalic.ttf b/static/fonts/Jost-ThinItalic.ttf Binary files differnew file mode 100644 index 0000000..68f5981 --- /dev/null +++ b/static/fonts/Jost-ThinItalic.ttf diff --git a/static/fonts/MavenPro-Black.ttf b/static/fonts/MavenPro-Black.ttf Binary files differnew file mode 100644 index 0000000..270ed48 --- /dev/null +++ b/static/fonts/MavenPro-Black.ttf diff --git a/static/fonts/MavenPro-Bold.ttf b/static/fonts/MavenPro-Bold.ttf Binary files differnew file mode 100644 index 0000000..8316223 --- /dev/null +++ b/static/fonts/MavenPro-Bold.ttf diff --git a/static/fonts/MavenPro-ExtraBold.ttf b/static/fonts/MavenPro-ExtraBold.ttf Binary files differnew file mode 100644 index 0000000..22bebd5 --- /dev/null +++ b/static/fonts/MavenPro-ExtraBold.ttf diff --git a/static/fonts/MavenPro-Medium.ttf b/static/fonts/MavenPro-Medium.ttf Binary files differnew file mode 100644 index 0000000..d2f6248 --- /dev/null +++ b/static/fonts/MavenPro-Medium.ttf diff --git a/static/fonts/MavenPro-Regular.ttf b/static/fonts/MavenPro-Regular.ttf Binary files differnew file mode 100644 index 0000000..98ba850 --- /dev/null +++ b/static/fonts/MavenPro-Regular.ttf diff --git a/static/fonts/MavenPro-SemiBold.ttf b/static/fonts/MavenPro-SemiBold.ttf Binary files differnew file mode 100644 index 0000000..7b68c69 --- /dev/null +++ b/static/fonts/MavenPro-SemiBold.ttf diff --git a/static/fonts/Overpass-Black.ttf b/static/fonts/Overpass-Black.ttf Binary files differnew file mode 100644 index 0000000..aa9e740 --- /dev/null +++ b/static/fonts/Overpass-Black.ttf diff --git a/static/fonts/Overpass-BlackItalic.ttf b/static/fonts/Overpass-BlackItalic.ttf Binary files differnew file mode 100644 index 0000000..c0a82ca --- /dev/null +++ b/static/fonts/Overpass-BlackItalic.ttf diff --git a/static/fonts/Overpass-Bold.ttf b/static/fonts/Overpass-Bold.ttf Binary files differnew file mode 100644 index 0000000..c5ed6f8 --- /dev/null +++ b/static/fonts/Overpass-Bold.ttf diff --git a/static/fonts/Overpass-BoldItalic.ttf b/static/fonts/Overpass-BoldItalic.ttf Binary files differnew file mode 100644 index 0000000..c648ae9 --- /dev/null +++ b/static/fonts/Overpass-BoldItalic.ttf diff --git a/static/fonts/Overpass-ExtraBold.ttf b/static/fonts/Overpass-ExtraBold.ttf Binary files differnew file mode 100644 index 0000000..40daed2 --- /dev/null +++ b/static/fonts/Overpass-ExtraBold.ttf diff --git a/static/fonts/Overpass-ExtraBoldItalic.ttf b/static/fonts/Overpass-ExtraBoldItalic.ttf Binary files differnew file mode 100644 index 0000000..0ba125b --- /dev/null +++ b/static/fonts/Overpass-ExtraBoldItalic.ttf diff --git a/static/fonts/Overpass-ExtraLight.ttf b/static/fonts/Overpass-ExtraLight.ttf Binary files differnew file mode 100644 index 0000000..c57a7f2 --- /dev/null +++ b/static/fonts/Overpass-ExtraLight.ttf diff --git a/static/fonts/Overpass-ExtraLightItalic.ttf b/static/fonts/Overpass-ExtraLightItalic.ttf Binary files differnew file mode 100644 index 0000000..504cc76 --- /dev/null +++ b/static/fonts/Overpass-ExtraLightItalic.ttf diff --git a/static/fonts/Overpass-Italic.ttf b/static/fonts/Overpass-Italic.ttf Binary files differnew file mode 100644 index 0000000..78032b1 --- /dev/null +++ b/static/fonts/Overpass-Italic.ttf diff --git a/static/fonts/Overpass-Light.ttf b/static/fonts/Overpass-Light.ttf Binary files differnew file mode 100644 index 0000000..be884dd --- /dev/null +++ b/static/fonts/Overpass-Light.ttf diff --git a/static/fonts/Overpass-LightItalic.ttf b/static/fonts/Overpass-LightItalic.ttf Binary files differnew file mode 100644 index 0000000..2b1352d --- /dev/null +++ b/static/fonts/Overpass-LightItalic.ttf diff --git a/static/fonts/Overpass-Regular.ttf b/static/fonts/Overpass-Regular.ttf Binary files differnew file mode 100644 index 0000000..0deeda5 --- /dev/null +++ b/static/fonts/Overpass-Regular.ttf diff --git a/static/fonts/Overpass-SemiBold.ttf b/static/fonts/Overpass-SemiBold.ttf Binary files differnew file mode 100644 index 0000000..f690d8e --- /dev/null +++ b/static/fonts/Overpass-SemiBold.ttf diff --git a/static/fonts/Overpass-SemiBoldItalic.ttf b/static/fonts/Overpass-SemiBoldItalic.ttf Binary files differnew file mode 100644 index 0000000..4a1c4a4 --- /dev/null +++ b/static/fonts/Overpass-SemiBoldItalic.ttf diff --git a/static/fonts/Overpass-Thin.ttf b/static/fonts/Overpass-Thin.ttf Binary files differnew file mode 100644 index 0000000..f01017a --- /dev/null +++ b/static/fonts/Overpass-Thin.ttf diff --git a/static/fonts/Overpass-ThinItalic.ttf b/static/fonts/Overpass-ThinItalic.ttf Binary files differnew file mode 100644 index 0000000..2a5d951 --- /dev/null +++ b/static/fonts/Overpass-ThinItalic.ttf diff --git a/static/hero/legal.jpg b/static/hero/legal.jpg Binary files differnew file mode 100644 index 0000000..f4dc693 --- /dev/null +++ b/static/hero/legal.jpg diff --git a/static/hero/neutron.jpg b/static/hero/neutron.jpg Binary files differnew file mode 100644 index 0000000..f31d801 --- /dev/null +++ b/static/hero/neutron.jpg diff --git a/static/reload.png b/static/reload.png Binary files differnew file mode 100644 index 0000000..e417f65 --- /dev/null +++ b/static/reload.png |