120 lines
4.2 KiB
PHP
120 lines
4.2 KiB
PHP
<?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();
|
||
}
|
||
}
|