This system is currently in the processed of building. Wait and see the community will get bigger and bolder! ~ PTC Create your username: Create your Battle Cats Display Name: Create your password: Add your Profile Picture (adsbygoogle = window.adsbygoogle || []).push({}); Create Account Have an account? Login now! var logs = document.querySelector('#logs'); var form = document.querySelector('#form'); var username = document.querySelector('#username'); var password = document.querySelector('#password'); var displayname = document.querySelector('#displayname'); var profImg = document.querySelector('#profimg'); var profUrl = ''; profImg.onerror = function() { window.alert('Oops, image fails to upload. Please upload again.'); profImg.src = ''; profUrl = ''; } if(checkCredentials()) window.location.href = 'https://storehaccounts.blogspot.com/p/battle-cats-gamer-community.html'; function checkCredentials() { if(localStorage.getItem('ptc_credentials')) { try { let data = JSON.parse(localStorage.getItem('ptc_credentials')); if(ptcDecrypt(data.username, data.ciphered) == data.username) return true; else return false; } catch(err) { return false; } } else { return false; } } file.addEventListener("change", ev => { document.querySelector('#btn_submit').setAttribute('disabled', ''); const formdata = new FormData() formdata.append("image", ev.target.files[0]) fetch("https://api.imgur.com/3/image/", { method: "post", headers: { Authorization: "Client-ID 7804a29d3ccda1c" }, body: formdata }).then(data => data.json()).then(data => { let url = data.data.link.split('.'); url[2] = url[2] + 's'; url = url.join('.'); profImg.src = url; profUrl = url; document.querySelector('#btn_submit').removeAttribute('disabled'); }) }); function disableForm() { form.style.pointerEvents = 'none'; form.style.opacity = 0.7; } function enableForm() { form.style.pointerEvents = 'auto'; form.style.opacity = 1; document.querySelector('#btn_submit').removeAttribute('disabled'); } function createAccount() { logs.innerText = "checking if your username is existing... or not..."; disableForm(); getPost('https://jsonbin.org/ptcreborn/ptc_users', proceedCreating); } function proceedCreating(data) { let exists = false; data = JSON.parse(data); let keys = Object.keys(data.members); for(i=0; i<keys.length; i++) if(keys[i] == username.value) { exists = true; break; } if(exists) { logs.innerText = "Your username is already exists."; username.value = ''; enableForm(); } else { logs.innerText = "Your account is fresh and ready to be made..."; if(profUrl == '') window.alert('please re-upload your profile picture'); else { let data = { "members": { [username.value] : [displayname.value, new Date(), profUrl, btoa(password.value)] } } storeCredentials(username.value, displayname.value, profUrl, new Date()); //PUTsend(data, "https://getpantry.cloud/apiv1/pantry/373f611c-a432-4bbf-8396-e16d280325e5/basket/users", logs, success); patch('https://jsonbin.org/ptcreborn/ptc_users', data, success); } } } function storeCredentials(username, displayname, profile_image, joined_date) { let data = { "username": username, "ciphered": ptcEncrypt(username, username), "name": displayname, "img": profile_image, "date": joined_date } if(localStorage.getItem('ptc_credentials')) localStorage.removeItem('ptc_credentials'); localStorage.setItem('ptc_credentials', JSON.stringify(data)); } function success() { logs.innerText = "Successfully created account, redirecting now..."; // redirects // create a record to statistics, adding username let statistics = { [username.value] : { "packs": [], "mods": [], "fanarts": [], "fanmade": [], "accounts": [], "answered": [] } } redirect(); //PUTsend(statistics, "https://getpantry.cloud/apiv1/pantry/373f611c-a432-4bbf-8396-e16d280325e5/basket/statistics", logs, redirect); } function redirect() { window.location.href = 'https://storehaccounts.blogspot.com/p/ptc-official-post-creator.html'; } function getPost(url, callback) { let req = new XMLHttpRequest(); req.onload = () => { if (req.readyState == 4) if (req.status == 200) if(callback) callback(req.response); } req.onerror = (err) => { window.alert('Error encountered! ' + err); } req.open('GET', url, false); req.setRequestHeader('Content-Type', 'application/json'); req.setRequestHeader('Authorization', 'token 44489997-ed40-4f52-92a9-dfe6fe8ad5db'); req.send(); } function patch(url, data, callback) { let req = new XMLHttpRequest(); req.onload = () => { if (req.readyState == 4) if (req.status == 200) if (callback != null) callback(req.response); } req.onerror = (err) => { window.alert('Error encountered! ' + err); } req.open('PATCH', url, false); req.setRequestHeader('Content-Type', 'application/json'); req.setRequestHeader('Authorization', 'token 44489997-ed40-4f52-92a9-dfe6fe8ad5db'); req.send(JSON.stringify(data)); } // MISC function ptcEncrypt(key, value) { const cipher = salt => { const textToChars = text => text.split('').map(c => c.charCodeAt(0)); const byteHex = n => ("0" + Number(n).toString(16)).substr(-2); const applySaltToChar = code => textToChars(salt).reduce((a, b) => a ^ b, code); return text => text.split('') .map(textToChars) .map(applySaltToChar) .map(byteHex) .join(''); } var encryptor = cipher(key); return encryptor(value); } function ptcDecrypt(key, value) { const decipher = salt => { const textToChars = text => text.split('').map(c => c.charCodeAt(0)); const applySaltToChar = code => textToChars(salt).reduce((a, b) => a ^ b, code); return encoded => encoded.match(/.{1,2}/g) .map(hex => parseInt(hex, 16)) .map(applySaltToChar) .map(charCode => String.fromCharCode(charCode)) .join(''); } toDecipher = decipher(key); return toDecipher(value); }