false, "Password" => false, "ConfirmPassword" => false, "RegistrationKey" => false, "ReCAPTCHA" => false ]; $Fields = (object) [ "Username" => "", "Password" => "", "ConfirmPassword" => "", "RegistrationKey" => "" ]; $BlacklistedASNs = [ ]; $MaximumAccounts = count(Users::GetAlternateAccounts(GetIPAddress())) >= 2; $RequestSent = false; if($_SERVER['REQUEST_METHOD'] == 'POST' && !$MaximumAccounts) { $RequestSent = true; $Fields->Username = $_POST['Username'] ?? ""; $Fields->Password = $_POST['Password'] ?? ""; $Fields->ConfirmPassword = $_POST['ConfirmPassword'] ?? ""; $Fields->RegistrationKey = $_POST['RegistrationKey'] ?? ""; if (str_starts_with($Fields->RegistrationKey, "PoIygonTicket(")) { redirect("https://www.youtube.com/watch?v=2Z4m4lnjxkY"); } if(empty($Fields->Username)) $Errors->Username = "Please enter a username"; else if(strlen($Fields->Username) < 3 || strlen($Fields->Username) > 16) $Errors->Username = "Your username can only be between three and sixteen characters long"; else if(!ctype_alnum($Fields->Username)) $Errors->Username = "Your username can only contain letters and numbers"; else { $Blacklisted = Database::singleton()->run( "SELECT COUNT(*) FROM namefilter WHERE (exact AND username = :name) OR (NOT exact AND :name LIKE CONCAT('%', username, '%'))", [":name" => strtolower($Fields->Username)] )->fetchColumn() > 0; if($Blacklisted) $Errors->Username = "That username is unavailable. Sorry!"; $AlreadyUsed = Database::singleton()->run( "SELECT COUNT(*) FROM users WHERE username = :name", [":name" => $Fields->Username] )->fetchColumn() > 0; if($AlreadyUsed) $Errors->Username = "Someone already has that username! Try choosing a different one."; } if (empty($Fields->Password)) $Errors->Password = "Please enter a password"; else if (strlen(preg_replace('/[0-9]/', "", $Fields->Password)) < 6) $Errors->Password = "Your password is too weak. Make sure it contains at least six non-numeric characters"; else if (strlen(preg_replace('/[^0-9]/', "", $Fields->Password)) < 2) $Errors->Password = "Your password is too weak. Make sure it contains at least two numbers"; if (empty($Fields->ConfirmPassword)) $Errors->ConfirmPassword = "Please confirm your password"; else if ($Fields->Password != $Fields->ConfirmPassword) $Errors->ConfirmPassword = "Confirmation password does not match with your password"; if (!VerifyReCAPTCHA()) $Errors->ReCAPTCHA = "ReCAPTCHA verification failed, please try again."; $TicketCheck = Database::singleton()->run( "SELECT COUNT(*) FROM InviteTickets WHERE Ticket = :Ticket AND UsedBy IS NULL AND NOT (SELECT banned FROM users WHERE id = InviteTickets.CreatedBy)", [":Ticket" => $Fields->RegistrationKey] )->fetchColumn(); if ($TicketCheck == 0) $Errors->RegistrationKey = "That registration ticket is invalid"; /* if(!$Errors->Username && !$Errors->Password && !$Errors->ConfirmPassword && !$Errors->RegistrationKey && !$Errors->ReCAPTCHA) { // fake error message - subtle difference to tell if its a proxy error $ASNumber = GetASNumber(GetIPAddress()); if ($ASNumber === false) { $Errors->ReCAPTCHA = "An unexpected error occurred"; } else if (in_array($ASNumber, $BlacklistedASNs)) { $Errors->ReCAPTCHA = "ReCAPTCHA verification failed, please try again"; } else { $IPInfo = GetIPInfo(GetIPAddress()); if ($IPInfo->proxy == "yes") $Errors->ReCAPTCHA = "ReCAPTCHA verification failed, please try again"; if ($IPInfo->type == "OpenVPN") $Errors->ReCAPTCHA = "ReCAPTCHA verification failed, please try again"; } } */ if(!$Errors->Username && !$Errors->Password && !$Errors->ConfirmPassword && !$Errors->RegistrationKey && !$Errors->ReCAPTCHA) { $auth = new Password($Fields->Password); $pwhash = $auth->create(); Database::singleton()->run( "INSERT INTO users (username, password, keyUsed, email, jointime, lastonline, regip, nextCurrencyStipend, status) VALUES (:name, :hash, :key, 'placeholder', UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), :ip, UNIX_TIMESTAMP()+86400, 'I\'m new to Polygon!')", [":name" => $Fields->Username, ":hash" => $pwhash, ":key" => $Fields->RegistrationKey, ":ip" => GetIPAddress()] ); $UserID = Database::singleton()->lastInsertId(); Database::singleton()->run( "UPDATE InviteTickets SET UsedBy = :UserID WHERE ID = (SELECT ID FROM InviteTickets WHERE Ticket = :Ticket AND UsedBy IS NULL ORDER BY TimeCreated ASC LIMIT 1)", [":Ticket" => $Fields->RegistrationKey, ":UserID" => (int) $UserID] ); Database::singleton()->run( "INSERT INTO ownedAssets (assetId, userId, wearing, timestamp) VALUES (162, :uid, 1, UNIX_TIMESTAMP()); INSERT INTO ownedAssets (assetId, userId, wearing, timestamp) VALUES (310, :uid, 1, UNIX_TIMESTAMP())", [":uid" => (int) $UserID] ); Database::singleton()->run("UPDATE assets SET Sales = Sales + 1 WHERE id IN (162, 310)"); Session::Create($UserID); // Polygon::RequestRender("Avatar", $UserID); // this is just malwarebytes's avatar - he still has the default avatar and is banned so eh copy(Polygon::GetSharedResource("thumbs/avatars/32-420x420.png"), Polygon::GetSharedResource("thumbs/avatars/$UserID-420x420.png")); copy(Polygon::GetSharedResource("thumbs/avatars/32-3DManifest.json"), Polygon::GetSharedResource("thumbs/avatars/$UserID-3DManifest.json")); copy(Polygon::GetSharedResource("thumbs/avatars/32-Player11Tex.png"), Polygon::GetSharedResource("thumbs/avatars/$UserID-Player11Tex.png")); copy(Polygon::GetSharedResource("thumbs/avatars/32-scene.mtl"), Polygon::GetSharedResource("thumbs/avatars/$UserID-scene.mtl")); copy(Polygon::GetSharedResource("thumbs/avatars/32-scene.obj"), Polygon::GetSharedResource("thumbs/avatars/$UserID-scene.obj")); $TicketCreator = Database::singleton()->run( "SELECT users.username FROM InviteTickets INNER JOIN users ON users.id = CreatedBy WHERE Ticket = :Ticket", [":Ticket" => $Fields->RegistrationKey] )->fetchColumn(); $WebhookMessage = sprintf("[%s] **%s** just joined! (ID %d - used an invite key created by %s)", date('d/m/Y h:i:s A'), $Fields->Username, $UserID, $TicketCreator); Discord::SendToWebhook(["content" => $WebhookMessage], Discord::WEBHOOK_POLYGON_JOINLOG, false); die(header("Location: /")); } } $pageBuilder = new PageBuilder(["title" => "Welcome"]); $pageBuilder->addResource("scripts", "https://www.google.com/recaptcha/api.js"); $pageBuilder->buildHeader(); ?>

welcome to

" id="signup" role="tabpanel" aria-labelledby="signup-tab">

Account limit reached

You can only create up to two accounts
" name="Username" id="username" autocomplete="username" value="Username)?>"> Username != false) { ?>Username?> 3 - 20 alphanumeric characters, no spaces or underscores
" name="Password" id="password" autocomplete="new-password" value="Password)?>"> Password != false) { ?>Password?> minimum 8 characters, must have at least 6 characters and 2 numbers
" name="ConfirmPassword" id="confirmpassword" value="ConfirmPassword)?>"> ConfirmPassword != false) { ?>ConfirmPassword?>
" name="RegistrationKey" id="regpass" value="RegistrationKey)?>"> RegistrationKey != false) { ?>RegistrationKey?> Project Polygon is a private community, you will need to obtain this from someone
ReCAPTCHA != false) { ?>
ReCAPTCHA?>
By signing up, you agree to the terms and privacy policy.
" id="login" role="tabpanel" aria-labelledby="login-tab">
buildFooter(); ?>