1/* ============================================================ 2 SAG UST GIRIS KUTUSU â her sayfada 3 4 Sahibin tarifi (2 Eylul): "bastin login'e sag uste, orda login 5 acildi ama baska sekme daha var register diye; ona basinca mc adini 6 giriyon sonra da kendi istedigin sifreyi yaziyon, bu kadar. Beni 7 hatirla secenegi de olcak. Sifremi unuttum'u kaldir." 8 9 Iki sekme, iki kutu: 10 Sign in ad + sifre + beni hatirla 11 Register ad + kendi sectigi sifre + beni hatirla 12 13 Ilk surumde kayitta oyun ici 6 haneli kod adimi vardi; sahip onu ve 14 "sifremi unuttum"u kaldirtti. 15 16 Bu dosya kendi basina calisir; sayfaya tek bir <script> satiri 17 eklemek yeter, markup'i kendisi uretiyor. 18 ============================================================ */ 19(function () { 20 "use strict"; 21 22 var AD_RE = /^[A-Za-z0-9_]{3,16}$/; 23 var nav = document.querySelector(".nav .wrap"); 24 if (!nav) return; 25 26 var nick = null, ekran = "giris"; 27 28 /* ---------- markup ---------- */ 29 var dugme = document.createElement("button"); 30 dugme.className = "hs-dugme"; 31 dugme.type = "button"; 32 dugme.textContent = "SIGN IN"; 33 nav.appendChild(dugme); 34 35 var kap = document.createElement("div"); 36 kap.className = "hs-ov"; 37 kap.hidden = true; 38 kap.innerHTML = 39 '<div class="hs-kutu" role="dialog" aria-modal="true">' + 40 '<button class="hs-kapat" type="button" aria-label="Close">×</button>' + 41 /* REGISTER SEKMESI KALDIRILDI (9 Eylul, sahip: "sitede register 42 kalksin, login olsun sitede sadece; herkesin sifresi oyundaki 43 sifresi olsun"). 44 45 Site hesabi artik kendiliginden aciliyor: oyuncu oyunda 46 "/login <sifre>" yazdiginda sunucudaki NebulaSiteSifre modulu 47 AYNI sifreyi sitenin bicimiyle (PBKDF2-SHA256) hesaplayip 48 hesabi yaziyor. Yani ayri bir kayit adimi anlamsiz. 49 50 Sunucu tarafi (functions/api/hesap.js) kayit islemini hala 51 kabul ediyor - eski baglantilar kirilmasin diye bilerek 52 birakildi, sadece arayuzden kaldirildi. */ 53 '<h3 class="hs-bas">Sign in</h3>' + 54 '<p class="hs-alt"></p>' + 55 '<div class="hs-alan hs-ad"><label>Minecraft name</label>' + 56 '<input id="hs-ad" autocomplete="username" spellcheck="false" maxlength="16" placeholder="XPRAISE"></div>' + 57 /* E-POSTA - sadece kayit sekmesinde gorunur (6 Eylul, sahip: 58 "sitedeki register/login'i degistiriyoruz, e-posta ile 59 register var"). GiriÅte SORULMUYOR: mevcut hesaplarda 60 e-posta yok, sorsaydik hepsi kilitlenirdi. */ 61 /* E-posta alani DURUYOR ama hep gizli: asagidaki kod ePosta'ya 62 bakiyor, elemani silsem null olur ve giris ekrani cokerdi. */ 63 '<div class="hs-alan hs-eposta" hidden><label>Email</label>' + 64 '<input id="hs-eposta" type="email" autocomplete="email" ' + 65 'spellcheck="false" maxlength="120" placeholder="[email protected]"></div>' + 66 '<div class="hs-alan hs-sifre"><label id="hs-sifre-et">Password</label>' + 67 '<input id="hs-sifre" type="password" autocomplete="current-password" placeholder="Your password"></div>' + 68 '<label class="hs-hatirla"><input type="checkbox" id="hs-hatirla" checked> Remember me</label>' + 69 '<button class="mcbtn wide hs-git" type="button">Sign in</button>' + 70 '<p class="hs-mesaj" hidden></p>' + 71 '</div>'; 72 document.body.appendChild(kap); 73 74 var $ = function (s) { return kap.querySelector(s); }; 75 var eAd = $("#hs-ad"), eSifre = $("#hs-sifre"), ePosta = $("#hs-eposta"), 76 eHatirla = $("#hs-hatirla"), eGit = $(".hs-git"), eMesaj = $(".hs-mesaj"), 77 eBas = $(".hs-bas"), eAlt = $(".hs-alt"); 78 79 var HATA = { 80 /* Kayit adimi kalkinca "hesabim yok" durumu da bu hataya dusuyor - 81 mesaj ne yapmasi gerektigini soylemeli, yoksa oyuncu takiliyor. */ 82 bad_login: "Wrong name or password. Your site password is your in-game " + 83 "password: join the server and type /login <password> once, " + 84 "then sign in here.", 85 bad_username: "That is not a valid Minecraft name.",
86 kayit_kapali: "Site accounts open by themselves. Log in once in game with /login <password>, then sign in here with the same password.", 87 already_registered: "That name already has an account. Sign in instead.", 88 bad_email: "Type a valid email address.", 89 weak_password: "Password must be at least 6 characters.", 90 command_failed: "Could not reach the server. Try again in a moment.", 91 storage_unavailable:"Could not save it. Tell the owner.", 92 no_secret: "Login is not configured. Tell the owner.", 93 ip_bulunamadi: "We cannot see you on the server. Join the game once from " + 94 "this same internet connection, then try again. Turn any VPN off.", 95 ip_uyusmuyor: "This connection is used by a different player in game. " + 96 "Register from the connection you actually play on, with any VPN off." 97 }; 98 99 function mesaj(t, iyi) { 100 eMesaj.hidden = !t; 101 eMesaj.textContent = t || ""; 102 eMesaj.className = "hs-mesaj" + (iyi ? " iyi" : ""); 103 } 104 105 /* ---------- ekranlar ---------- 106 Iki ekran, iki kutu. Sahibin tarifi aynen: "ad gir, sifre yaz, 107 bu kadar". Oyun ici kod adimi ve "sifremi unuttum" onun istegiyle 108 kaldirildi. */ 109 function ciz() { 110 mesaj(""); 111 kap.querySelectorAll(".hs-sekme button").forEach(function (b) { 112 b.classList.toggle("on", b.dataset.e === ekran); 113 }); 114 if (ekran === "giris") { 115 eBas.textContent = "Sign in"; 116 eAlt.textContent = "Use your in-game password - the one you type in /login."; 117 $("#hs-sifre-et").textContent = "Password"; 118 eSifre.autocomplete = "current-password"; 119 eSifre.placeholder = "Your password"; 120 eGit.textContent = "Sign in"; 121 kap.querySelector(".hs-eposta").hidden = true; 122 } else { 123 eBas.textContent = "Create your account"; 124 eAlt.textContent = "Type your Minecraft name and pick a password for the site."; 125 $("#hs-sifre-et").textContent = "Choose a password (min 6 characters)"; 126 eSifre.autocomplete = "new-password"; 127 eSifre.placeholder = "A password you pick"; 128 eGit.textContent = "Create account"; 129 kap.querySelector(".hs-eposta").hidden = false; 130 } 131 } 132 133 /* Kayit ekrani artik ACILMIYOR - cagiran ne derse desin giris. */ 134 function ac(e) { ekran = "giris"; kap.hidden = false; ciz(); 135 setTimeout(function () { eAd.focus(); }, 40); } 136 function kapa() { kap.hidden = true; } 137 138 dugme.addEventListener("click", function () { 139 if (nick) gonder({ islem: "cikis" }, function () { girisliYap(null); }); 140 else ac("giris"); 141 }); 142 $(".hs-kapat").addEventListener("click", kapa); 143 kap.addEventListener("click", function (e) { if (e.target === kap) kapa(); }); 144 document.addEventListener("keydown", function (e) { if (e.key === "Escape") kapa(); }); 145 kap.querySelectorAll(".hs-sekme button").forEach(function (b) { 146 b.addEventListener("click", function () { ac(b.dataset.e); }); 147 }); 148 [eAd, ePosta, eSifre].forEach(function (i) { 149 i.addEventListener("keydown", function (e) { if (e.key === "Enter") eGit.click(); }); 150 }); 151 152 function gonder(govde, bitti) { 153 fetch("/api/hesap", { 154 method: "POST", headers: { "content-type": "application/json" }, 155 body: JSON.stringify(govde), 156 }) 157 .then(function (r) { return r.json()["catch"](function () { return null; }); }) 158 .then(function (d) { bitti(d); }) 159 ["catch"](function () { bitti(null); }); 160 } 161 162 eGit.addEventListener("click", function () { 163 var ad = (eAd.value || "").trim(); 164 var sifre = eSifre.value || ""; 165 if (!AD_RE.test(ad)) return mesaj(HATA.bad_username, false); 166 if (ekran === "kayit" && sifre.length < 6) return mesaj(HATA.weak_password, false); 167 if (!sifre) return mesaj("Type your password.", false); 168 var eposta = (ePosta.value || "").trim(); 169 /* Kayitta e-posta ZORUNLU. Kalip kasten gevsek - amac yazim 170 hatasini yakalamak, RFC dogrulamak degil; asiri siki kalip 171 gecerli adresleri reddediyor. */ 172 if (ekran === "kayit" && !/^[^@\s]+@[^@\s.]+\.[^@\s]{2,}$/.test(eposta)) 173 return mesaj("Type a valid email address.", false); 174 175 var eskiYazi = eGit.textContent; 176 eGit.disabled = true; eGit.textContent = "â¦"; 177 gonder({ islem: ekran, nick: ad, sifre: sifre, eposta: eposta, 178 hatirla: !!eHatirla.checked }, 179 function (d) { 180 eGit.disabled = false; eGit.textContent = eskiYazi; 181 if (d && d.ok) { girisliYap(d.nick); kapa(); } 182 else mesaj((d && HATA[d.error]) || "Something went wrong. Try again.", false); 183 }); 184 }); 185 186 /* ---------- girisli gorunum ---------- */ 187 function girisliYap(a) { 188 nick = a || null; 189 if (nick) { 190 dugme.classList.add("girisli"); 191 dugme.innerHTML = '<img src="https://mc-heads.net/avatar/' + 192 encodeURIComponent(nick) + '/22" alt=""><span>' + nick + '</span>'; 193 dugme.title = "Sign out"; 194 } else { 195 dugme.classList.remove("girisli"); 196 dugme.textContent = "SIGN IN"; 197 dugme.title = ""; 198 } 199 /* Sayfalar bunu dinleyip kendi arayuzunu guncelleyebilir 200 (magazada rutbe/kasa kartlarinin kilidi bu olayla aciliyor). */ 201 document.dispatchEvent(new CustomEvent("nbhesap", { detail: { nick: nick } })); 202 } 203 204 fetch("/api/hesap", { headers: { accept: "application/json" }, cache: "no-store" }) 205 .then(function (r) { return r.json(); }) 206 .then(function (d) { girisliYap(d && d.girisli ? d.nick : null); }) 207 ["catch"](function () { girisliYap(null); }); 208})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.