game/_incl_data/class/UserRegister.php

120 lines
4.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use Core\Db;
class UserRegister
{
public function hasMixedLatCur(string $txt): bool
{
$en = preg_match("/^(([0-9A-z -])+)$/i", $txt);
$ru = preg_match("/^(([0-9А-я _-])+)$/i", $txt);
return ($ru && $en) || (!$ru && !$en);
}
public function hasGoodLogin(string $login): string
{
$isRestricted = in_array(
$login,
[
'ангел', 'angel', 'администрация', 'administration', 'Комментатор',
'Мироздатель', 'Мусорщик', 'Падальщик', 'Повелитель',
'Архивариус', 'Пересмешник', 'Волынщик', 'Лорд Разрушитель',
'Милосердие', 'Справедливость', 'Искушение', 'Вознесение',
]
);
$isRegistered = Db::getValue('select count(*) from users where login = ?', [$login]);
//Бывшие в употреблении логины. Дичь, но ладно.
$wasRegistered = Db::getValue('select count(*) from lastnames where login = ?', [$login]);
$login = str_replace(' ', ' ', $login);
//Логин от 4 до 20 символов
if (strlen($login) > 20) {
$error = 'Логин должен содержать не более 20 символов.';
}
if (strlen($login) < 4) {
$error = 'Логин должен содержать не менее 4 символов.';
}
if ($this->hasMixedLatCur($login)) {
$error = 'В логине разрешено использовать только буквы одного алфавита русского или английского. Нельзя смешивать.';
}
//Разделители
if (substr_count($login, ' ') + substr_count($login, '-') + substr_count($login, '_') > 2) {
$error = 'Не более двух разделителей одновременно (пробел, тире, нижнее подчеркивание).';
}
if (!empty($error)) {
$error .= '<br> Пример правильного никнейма: Петя Убиватор, Коля, xalop. <br> Пример неправильного никнейма: )))), kolя)=-/.';
}
if ($isRegistered || $wasRegistered || $isRestricted) {
$error = 'Логин ' . $login . ' уже занят, выберите другой.';
}
return $error ?? '';
}
public function hasGoodEmail(string $email): string
{
$isRegistered = Db::getValue('select count(*) from users where mail = ?', [$email]);
$isBlocked = Db::getValue('select count(*) from ban_email where email = ?', [$email]);
if (!filter_var($email, FILTER_VALIDATE_EMAIL) || $isRegistered) {
$error = 'Неправильный email.';
}
if ($isBlocked) {
$error = 'Адрес заблокирован.';
}
$allowedDomains = Db::getColumn('select email from trust_email');
$domain = explode('@', $email)[1];
if (!in_array($domain, $allowedDomains)) {
$error = 'Данный почтовый сервис использовать нельзя.';
}
return $error ?? '';
}
public function hasGoodEmailCode(string $email, int $code): string
{
$check = Db::getValue('select code from secure_code where email = ?', [$email]);
if ($code !== $check) {
return 'Неверный проверочный код.';
}
return '';
}
public function hasGoodPassword(string $password1, string $password2): string
{
if ($password1 !== $password2) {
$error = 'Пароли не совпадают';
}
if (strlen($password1 < 8)) {
$error = 'Пароль должен быть больше 8 символов';
$error .= 'Можете использовать сгенерированный пароль: ' . PassGen::new();
}
return $error ?? '';
}
public static function new(string $login, string $password, string $email, $ref, $birthday, $sex): string
{
$password = password_hash($password, PASSWORD_DEFAULT);
$ip = UserIp::get();
$sex = (int)$sex - 10; //На входе 10\11, а передать надо 0\1.
Db::sql(
'insert into users (users.real,login,host_reg,pass,ip,ipreg,room,timereg,mail,bithday,sex,fnq,molch2,level,hobby,clan_zv) values (1,?,?,?,?,?,9,unix_timestamp(),?,?,?,0,unix_timestamp() + 86400,8,\'\',0)',
[
$login,
$ref ?? '',
$password,
$ip,
$ip,
$email,
date('d.m.Y', strtotime($birthday)),
$sex,
]
);
return Db::lastInsertId();
}
}