summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_profile/index.php6
-rw-r--r--admin/objects/index.php49
-rw-r--r--includes/changes.json20
-rw-r--r--includes/session.php10
-rw-r--r--lang/en.json31
-rw-r--r--lang/fr.json31
-rw-r--r--nickname/change/index.php108
-rw-r--r--nickname/index.php183
8 files changed, 433 insertions, 5 deletions
diff --git a/_profile/index.php b/_profile/index.php
index 733ea0e..47c8334 100644
--- a/_profile/index.php
+++ b/_profile/index.php
@@ -1,6 +1,6 @@
<?php
-require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.php"; global $_USER;
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.php"; global $_USER; global $_PROFILE;
$id = array_values(array_filter(array_keys($_GET), function ($i) {
return str_starts_with($i, "/") && strlen($i) > 1;
@@ -60,6 +60,10 @@ foreach (array_filter(scandir($_SERVER["DOCUMENT_ROOT"] . "/includes/data/people
<img src="/icons/report.svg" style="vertical-align: middle; width: 24px;<?= $id === $_USER ? "opacity:.5;" : "" ?>">
<span style="vertical-align: middle;"><?= $gender === "fem" || $gender === "trans_fem" ? l("lang_profile_report_female") : ($gender === "male" || $gender === "trans_male" ? l("lang_profile_report_male") : l("lang_profile_report")) ?></span>
</a></li>
+ <li><a class="dropdown-item <?= $id !== $_USER || !isset($_PROFILE["ultra"]) || !$_PROFILE["ultra"] ? "disabled" : "" ?>" href="/nickname">
+ <img src="/icons/rename.svg" style="vertical-align: middle; width: 24px;">
+ <span style="vertical-align: middle;"><?= l("lang_nickname_action") ?></span>
+ </a></li>
<li><a class="dropdown-item <?= $id !== $_USER ? "disabled" : "" ?>" href="/download">
<img src="/icons/download.svg" style="vertical-align: middle; width: 24px;">
<span style="vertical-align: middle;"><?= l("lang_download_action") ?></span>
diff --git a/admin/objects/index.php b/admin/objects/index.php
index e910025..735e4e2 100644
--- a/admin/objects/index.php
+++ b/admin/objects/index.php
@@ -72,6 +72,10 @@ usort($keys, function ($a, $b) {
grid-template-columns: 1fr 2fr 0 !important;
}
}
+
+ .filteredOut {
+ display: none !important;
+ }
</style>
<div class="container">
@@ -80,11 +84,30 @@ usort($keys, function ($a, $b) {
<h1><?= l("lang_admin_titles_objects") ?></h1>
<script src="/fuse.php"></script>
- <input style="margin-bottom: 15px;" id="search" autocapitalize="none" autocomplete="off" spellcheck="false" autofocus class="form-control" placeholder="<?= l("lang_admin_search") ?>" value="" onkeyup="search();" onkeydown="search();" onchange="search();">
+ <div class="input-group">
+ <select onchange="updateFilter();" style="height: 100%;" class="form-select" id="filter">
+ <option value="" selected><?= l("lang_admin_types_all") ?></option>
+ <option value="articles"><?= l("lang_admin_types2_articles") ?></option>
+ <option value="gallery"><?= l("lang_admin_types2_gallery") ?></option>
+ <option value="people"><?= l("lang_admin_types2_people") ?></option>
+ <option value="profiles"><?= l("lang_admin_types2_profiles") ?></option>
+ <option value="requests"><?= l("lang_admin_types2_requests") ?></option>
+ </select>
+ <script>
+ document.getElementById("filter").value = "";
+ </script>
+ <input style="width: 50%; margin-bottom: 15px;" id="search" autocapitalize="none" autocomplete="off" spellcheck="false" autofocus class="form-control" placeholder="<?= l("lang_admin_search") ?>" value="" onkeyup="search();" onkeydown="search();" onchange="search();">
+ </div>
<div class="list-group" id="all-items">
<?php $entries = []; foreach ($keys as $item): $entries[] = ["id" => $item["id"], "name" => $item["name"] ?? null]; ?>
- <a id="search-result-<?= $item["id"] ?>" class="search-result list-group-item list-group-item-action" href="/admin/edit/?id=<?= $item["id"] ?>" style="display: grid; grid-template-columns: 1fr 2fr 2fr; grid-gap: 10px;">
+ <a id="search-result-<?= $item["id"] ?>" class="search-result list-group-item list-group-item-action <?= match ($item["type"]) {
+ "articles" => "item-articles",
+ "gallery" => "item-gallery",
+ "people" => "item-people",
+ "profiles" => "item-profiles",
+ "requests" => "item-requests",
+ } ?>" href="/admin/edit/?id=<?= $item["id"] ?>" style="display: grid; grid-template-columns: 1fr 2fr 2fr; grid-gap: 10px;">
<?= match ($item["type"]) {
"articles" => "<span style='width: max-content; display: flex; height: max-content; align-self: center;' class='badge bg-success rounded-pill'>" . l("lang_admin_types_articles") . "</span>",
"gallery" => "<span style='width: max-content; display: flex; height: max-content; align-self: center;' class='badge bg-success rounded-pill'>" . l("lang_admin_types_gallery") . "</span>",
@@ -104,7 +127,7 @@ usort($keys, function ($a, $b) {
</button>
<ul class="dropdown-menu">
<?php foreach (array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/skels"), function ($i) { return !str_starts_with($i, "."); }) as $skel): $id = substr($skel, 0, -5); ?>
- <li><a class="dropdown-item" href="/admin/create/?skel=<?= $id ?>"><?= $id ?></a></li>
+ <li><a class="dropdown-item" href="/admin/create/?skel=<?= $id ?>"><?= l("lang_admin_types_" . $id) ?></a></li>
<?php endforeach; ?>
</ul>
</div>
@@ -138,6 +161,26 @@ usort($keys, function ($a, $b) {
document.getElementById("search-results").innerHTML = fuse.search(query).map(i => i.item.id).map(i => document.getElementById("search-result-" + i).outerHTML).join("");
}
+
+ function updateFilter() {
+ let filter = document.getElementById("filter").value;
+
+ if (filter === "") {
+ for (let item of Array.from(document.getElementsByClassName("search-result"))) {
+ item.classList.remove("filteredOut");
+ }
+ } else {
+ for (let item of Array.from(document.getElementsByClassName("search-result"))) {
+ item.classList.remove("filteredOut");
+ }
+
+ for (let item of Array.from(document.getElementsByClassName("search-result"))) {
+ if (!item.classList.contains("item-" + filter)) {
+ item.classList.add("filteredOut");
+ }
+ }
+ }
+ }
</script>
<br><br>
diff --git a/includes/changes.json b/includes/changes.json
index 0822a1f..f541fe3 100644
--- a/includes/changes.json
+++ b/includes/changes.json
@@ -1,5 +1,23 @@
[
{
+ "date": "2023-06-24 08:00",
+ "title": {
+ "en": "Delta is finally here",
+ "fr": "Delta est enfin là"
+ },
+ "message": {
+ "en": "We are finally here. Delta is finally officially released. All of the Delta team hopes you make great use of Delta and, as a Delta Plus user, that you give us valuable feedback about upcoming features to enhance your experience.",
+ "fr": "Nous y sommes enfin. Delta est enfin officiellement sorti. Toute l'équipe Delta espère que vous ferez bon usage de Delta, et qu'en tant qu'utilisateur·ice Delta Plus, vous nous fournirez des retours de qualité sur les fonctionnalités à venir pour améliorer votre expérience."
+ },
+ "version": "5.2.15",
+ "affects": {
+ "public": true,
+ "free": true,
+ "plus": true,
+ "ultra": true
+ }
+ },
+ {
"date": "2023-06-07 08:30",
"title": {
"en": "Here is Delta RC 2",
@@ -9,7 +27,7 @@
"en": "A pretty major update that makes your Delta experience better. New login screen, new registration form, translations, better accuracy, and a ton of bug fixes.",
"fr": "Une mise à jour plutôt majeure qui rend votre expérience Delta meilleure. Un nouvel écran de connexion, un nouveau formulaire d'inscription, des traductions, une meilleure précision, et une tonne de problèmes corrigés."
},
- "version": "5.1.14-rc1",
+ "version": "5.1.14-rc2",
"affects": {
"public": true,
"free": true,
diff --git a/includes/session.php b/includes/session.php
index d904efa..de323c9 100644
--- a/includes/session.php
+++ b/includes/session.php
@@ -1,5 +1,10 @@
<?php
+if (time() < 1687600800 && $_SERVER['HTTP_X_FORWARDED_FOR'] !== "109.209.87.15") {
+ header("Location: https://equestria.horse");
+ die();
+}
+
if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/maintenance")) die(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/maintenance.html"));
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/functions.php";
@@ -68,6 +73,11 @@ if (isset($_PROFILE)) {
$_PROFILE["last_seen"] = date('d-m-Y');
saveProfile();
}
+
+ if (isset($_PROFILE["nick_name"]) && (!isset($_PROFILE["ultra"]) || !$_PROFILE["ultra"])) {
+ $_PROFILE["nick_name"] = null;
+ saveProfile();
+ }
}
function addToUserHistory($id) {
diff --git a/lang/en.json b/lang/en.json
index 86a926f..3435d21 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -1045,12 +1045,20 @@
"json": "The data you sent is not valid JSON data. Check the syntax and try again.",
"auth": "Updating a user's email address may take a while to apply to the authentication server",
"types": {
+ "all": "Everything",
"articles": "Article",
"gallery": "Album",
"people": "Person",
"profiles": "Profile",
"requests": "Request"
},
+ "types2": {
+ "articles": "Articles",
+ "gallery": "Albums",
+ "people": "People",
+ "profiles": "Profiles",
+ "requests": "Requests"
+ },
"support": {
"search": "Look up",
"request": "Requested %1 by %2",
@@ -1283,5 +1291,28 @@
"available": "You are viewing the %1 version of this page, but a version in %2 is available. Note, however, that the translation version may not be 100% accurate.",
"original": "View original",
"translated": "View translated"
+ },
+ "nickname": {
+ "action": "Change nickname",
+ "title": "Nickname change",
+ "title2": "Change your nickname",
+ "requirements": "Your nickname must follow the following requirements for you to be able to use it on Delta:",
+ "confirm": "Confirm change",
+ "list": [
+ "Between 3 and 25 characters",
+ "No consecutive special characters",
+ "3 special characters or less",
+ "Start with a letter",
+ "End with a letter or digit",
+ "4 digits or less",
+ "At least 50% letters",
+ "At least %1 (50%) letters"
+ ],
+ "invalid": "One or more of the requirements are not met, cannot proceed with the nickname change. Please check the requirements below.",
+ "close": "Your nickname is too close to another user's name, nickname, or a person's page name. Please choose another nickname.",
+ "done": [
+ "Successfully changed nickname.",
+ "Your new nickname has been saved and will appear everywhere on Delta within a few minutes."
+ ]
}
} \ No newline at end of file
diff --git a/lang/fr.json b/lang/fr.json
index 4cee94f..0db5ce6 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -1045,12 +1045,20 @@
"json": "Les données que vous avez envoyées ne sont pas du JSON valide. Vérifiez la syntaxe et essayez de nouveau.",
"auth": "Mettre à jour l'adresse email d'un·e utilisateur·ice peut prendre du temps à s'appliquer au serveur d'authentification",
"types": {
+ "all": "Tout",
"articles": "Article",
"gallery": "Album",
"people": "Personne",
"profiles": "Profil",
"requests": "Demande"
},
+ "types2": {
+ "articles": "Articles",
+ "gallery": "Albums",
+ "people": "Personnes",
+ "profiles": "Profils",
+ "requests": "Demandes"
+ },
"support": {
"search": "Chercher",
"request": "Demandé %1 par %2",
@@ -1276,5 +1284,28 @@
"Voici la raison que nous avons fournie :"
]
}
+ },
+ "nickname": {
+ "action": "Changer de surnom",
+ "title": "Changement de surnom",
+ "title2": "Changez votre surnom",
+ "requirements": "Votre surnom doit respecter les conditions suivantes pour que vous puissiez l'utiliser sur Delta :",
+ "confirm": "Confirmer le changement",
+ "list": [
+ "Faire de 3 à 25 caractères",
+ "Pas de caractères spéciaux consécutifs",
+ "3 caractères spéciaux ou moins",
+ "Commence par une lettre",
+ "Se termine par une lettre ou un chiffre",
+ "4 chiffres ou moins",
+ "Au moins 50% de lettres",
+ "Au moins %1 (50%) lettres"
+ ],
+ "invalid": "Une ou plusieurs condition·s ne sont pas respectées, impossible de continuer avec le changement de surnom. Merci de vérifier les conditions ci-dessous.",
+ "close": "Votre surnom est trop similaire au nom ou surnom d'un autre utilisateur, ou au nom d'une page de personne. Merci d'utiliser un autre surnom.",
+ "done": [
+ "Surnom changé.",
+ "Votre nouveau surnom a été enregistré et apparaîtra partout sur Delta d'ici quelques minutes."
+ ]
}
} \ No newline at end of file
diff --git a/nickname/change/index.php b/nickname/change/index.php
new file mode 100644
index 0000000..9786cbc
--- /dev/null
+++ b/nickname/change/index.php
@@ -0,0 +1,108 @@
+<?php
+
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.php";
+global $_PROFILE; global $_USER;
+
+if (!isset($_PROFILE["ultra"]) || !$_PROFILE["ultra"]) {
+ header("Location: /");
+ die();
+}
+
+if (!isset($_GET["name"])) die();
+$name = trim(base64_decode(trim($_GET["name"])));
+
+if (strlen($name) === 0) {
+ $_PROFILE["nick_name"] = null;
+ saveProfile();
+ return;
+}
+
+$valid = true;
+$failed = [];
+
+if (strlen($name) >= 3) {
+ $lettersProp = ceil(strlen($name) / 2);
+} else {
+ $lettersProp = 1;
+}
+
+if (!(strlen($name) >= 3 && strlen($name) <= 25)) {
+ $valid = false;
+ $failed[] = "LENGTH";
+}
+
+if (preg_match("/[^\da-z]{2,}/mi", $name) === 1 || preg_match("/[^\da-z]{2,}/mi", $name)) {
+ $valid = false;
+ $failed[] = "CONSECUTIVE";
+}
+
+if (preg_match_all("/[^\da-z]/mi", $name) > 3) {
+ $valid = false;
+ $failed[] = "SPECIAL";
+}
+
+if (strlen(preg_replace("/[^\d]/mi", "", $name)) > 4) {
+ $valid = false;
+ $failed[] = "DIGITS";
+}
+
+if (preg_match("/^[a-z]/mi", $name) == 0) { // Not === because we also want to match 'false'
+ $valid = false;
+ $failed[] = "START";
+}
+
+if (preg_match("/[a-z\d]$/mi", $name) == 0) { // Not === because we also want to match 'false'
+ $valid = false;
+ $failed[] = "END";
+}
+
+if (strlen(preg_replace("/[^a-z]/mi", "", $name)) < $lettersProp) {
+ $valid = false;
+ $failed[] = "LETTERS";
+}
+
+if (!$valid) {
+ header("Location: /nickname/?prefill=" . urlencode(pf_utf8_decode($_GET["name"])) . "&invalid=" . implode(",", $failed));
+ die();
+}
+
+$users = [];
+
+foreach (array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles"), function ($i) {
+ return !str_starts_with($i, ".");
+}) as $user) {
+ if ($_USER . ".json" !== $user) {
+ $data = json_decode(pf_utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/" . $user)), true);
+ $users[] = $data["first_name"] . " " . $data["last_name"];
+ $users[] = $data["first_name"];
+ if (isset($data["nick_name"]) && strlen(trim($data["nick_name"])) > 0 && isset($data["ultra"]) && $data["ultra"]) $users[] = $data["nick_name"];
+ }
+}
+
+foreach (array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/people"), function ($i) {
+ return !str_starts_with($i, ".");
+}) as $user) {
+ $data = json_decode(pf_utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/people/" . $user)), true);
+ if (!isset($data["delta"]) || $data["delta"] !== $_USER) {
+ $users[] = $data["first_name"] . " " . $data["last_name"];
+ $users[] = $data["first_name"];
+ }
+}
+
+$close = false;
+
+foreach ($users as $user) {
+ if (levenshtein($name, $user) < 7) {
+ $close = true;
+ }
+}
+
+if ($close) {
+ header("Location: /nickname/?prefill=" . urlencode(pf_utf8_decode($_GET["name"])) . "&close");
+ die();
+}
+
+$_PROFILE["nick_name"] = pf_utf8_encode(str_replace("'", "&apos;", str_replace('"', "&quot;", str_replace("<", "&lt;", str_replace(">", "&gt;", str_replace("&", "&amp;", $name))))));
+saveProfile();
+header("Location: /nickname/?success");
+die(); \ No newline at end of file
diff --git a/nickname/index.php b/nickname/index.php
new file mode 100644
index 0000000..bbf14bc
--- /dev/null
+++ b/nickname/index.php
@@ -0,0 +1,183 @@
+<?php
+
+$title = "lang_nickname_title";
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.php";
+
+if (!isset($_PROFILE["ultra"]) || !$_PROFILE["ultra"]) {
+ header("Location: /");
+ die();
+}
+
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/header.php";
+require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/navigation.php";
+global $_PROFILE; global $_USER;
+
+?>
+
+<style>
+ @media (max-width: 900px) {
+ #grid {
+ grid-template-columns: 1fr !important;
+ grid-gap: 0 !important;
+ }
+
+ #grid > hr {
+ display: block !important;
+ }
+ }
+</style>
+
+<div class="container">
+ <br><br>
+ <h1><?= l("lang_nickname_title2") ?></h1>
+
+ <?php if (isset($_GET["invalid"]) || isset($_GET["close"])): ?>
+ <div id="alert" class="alert alert-primary">
+ <?php if (isset($_GET["invalid"])): ?><b><?= l("lang_upload_error") ?></b><?= l("lang_nickname_invalid") ?><?php endif; ?>
+ <?php if (isset($_GET["close"])): ?><b><?= l("lang_upload_error") ?></b><?= l("lang_nickname_close") ?><?php endif; ?>
+ </div>
+ <?php endif; ?>
+
+ <?php if (isset($_GET["success"])): ?>
+ <div id="alert" class="alert alert-success">
+ <b><?= l("lang_nickname_done_0") ?></b> <?= l("lang_nickname_done_1") ?>
+ </div>
+ <?php endif; ?>
+
+ <div style="display: grid; grid-template-columns: 1fr 1fr; grid-gap: 20px;" id="grid">
+ <div>
+ <form onsubmit="checkAndSubmit(); return false;">
+ <p>
+ <input autofocus name="name" id="name" onkeydown="checkName();" onkeyup="checkName();" autocomplete="false" autocapitalize="false" spellcheck="false" class="form-control" placeholder="<?= "$_PROFILE[first_name] $_PROFILE[last_name]" ?>" value="<?= isset($_GET["prefill"]) ? str_replace('"', '&quot;', base64_decode($_GET["prefill"])) : ($_PROFILE["nick_name"] ?? "") ?>">
+ </p>
+
+ <button id="confirm-btn" class="btn btn-primary" disabled><?= l("lang_nickname_confirm") ?></button>
+ </form>
+ </div>
+
+ <hr style="display: none;">
+
+ <div>
+ <p><?= l("lang_nickname_requirements") ?></p>
+
+ <ul>
+ <li id="condition-0" class="text-success"><?= l("lang_nickname_list_0") ?></li>
+ <li id="condition-1" class="text-success"><?= l("lang_nickname_list_1") ?></li>
+ <li id="condition-2" class="text-success"><?= l("lang_nickname_list_2") ?></li>
+ <li id="condition-3" class="text-success"><?= l("lang_nickname_list_5") ?></li>
+ <li id="condition-5" class="text-success"><?= l("lang_nickname_list_3") ?></li>
+ <li id="condition-6" class="text-success"><?= l("lang_nickname_list_4") ?></li>
+ <li id="condition-4-a" class="text-success"><?= l("lang_nickname_list_6") ?></li>
+ <li id="condition-4-b" class="text-success" data-text-original="<?= l("lang_nickname_list_7") ?>"><?= l("lang_nickname_list_7") ?></li>
+ </ul>
+ </div>
+
+ <script>
+ window.isValid = false;
+
+ function checkName(skip) {
+ if (document.getElementById("alert") && !skip) document.getElementById("alert").outerHTML = "";
+
+ let isValid = false;
+ let lettersProp = 1;
+ let name = document.getElementById("name").value.trim();
+ document.getElementById("confirm-btn").disabled = true;
+
+ if (name.length >= 3) {
+ lettersProp = Math.ceil(name.length / 2);
+ document.getElementById("condition-4-a").style.display = "none";
+ document.getElementById("condition-4-b").style.display = "";
+ document.getElementById("condition-4-b").innerText = document.getElementById("condition-4-b").getAttribute("data-text-original").replace("%1", lettersProp);
+ } else {
+ document.getElementById("condition-4-b").style.display = "none";
+ document.getElementById("condition-4-a").style.display = "";
+ }
+
+ if (name.length === 0) {
+ isValid = true;
+ } else {
+ for (let i of [0, 1, 2, 3, "4-a", "4-b", 5, 6]) {
+ document.getElementById("condition-" + i).classList.remove("text-success");
+ document.getElementById("condition-" + i).classList.add("text-danger");
+ }
+
+ isValid = true;
+
+ if (name.length >= 3 && name.length <= 25) {
+ document.getElementById("condition-0").classList.add("text-success");
+ document.getElementById("condition-0").classList.remove("text-danger");
+ } else {
+ isValid = false;
+ }
+
+ if (!name.match(/[^\da-z]{2,}/gmi)) {
+ document.getElementById("condition-1").classList.add("text-success");
+ document.getElementById("condition-1").classList.remove("text-danger");
+ } else {
+ isValid = false;
+ }
+
+ if (
+ (name.match(/[^\da-z]/gmi) && name.match(/[^\da-z]/gmi).length <= 3) ||
+ (!name.match(/[^\da-z]/gmi))
+ ) {
+ document.getElementById("condition-2").classList.add("text-success");
+ document.getElementById("condition-2").classList.remove("text-danger");
+ } else {
+ isValid = false;
+ }
+
+ if (name.replace(/[^\d]/gmi, "").length <= 4) {
+ document.getElementById("condition-3").classList.add("text-success");
+ document.getElementById("condition-3").classList.remove("text-danger");
+ } else {
+ isValid = false;
+ }
+
+ if (name.match(/^[a-z]/gmi)) {
+ document.getElementById("condition-5").classList.add("text-success");
+ document.getElementById("condition-5").classList.remove("text-danger");
+ } else {
+ isValid = false;
+ }
+
+ if (name.match(/[a-z\d]$/gmi)) {
+ document.getElementById("condition-6").classList.add("text-success");
+ document.getElementById("condition-6").classList.remove("text-danger");
+ } else {
+ isValid = false;
+ }
+
+ if (name.replace(/[^a-z]/gmi, "").length >= lettersProp) {
+ document.getElementById("condition-4-a").classList.add("text-success");
+ document.getElementById("condition-4-a").classList.remove("text-danger");
+ document.getElementById("condition-4-b").classList.add("text-success");
+ document.getElementById("condition-4-b").classList.remove("text-danger");
+ } else {
+ isValid = false;
+ }
+ }
+
+ if (isValid) {
+ document.getElementById("confirm-btn").disabled = false;
+ } else {
+ document.getElementById("confirm-btn").disabled = true;
+ }
+
+ return isValid;
+ }
+
+ function checkAndSubmit() {
+ if (checkName()) {
+ location.href = "/nickname/change/?name=" + encodeURIComponent(btoa(document.getElementById("name").value.trim()))
+ }
+ }
+
+ checkName(true);
+ </script>
+ </div>
+
+ <br><br>
+</div>
+
+<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/footer.php"; ?> \ No newline at end of file