game/_incl_data/class/UserRegister.php
2023-01-10 20:29:27 +02:00

247 lines
10 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\Config;
use Core\Db;
class UserRegister
{
private string $error = '';
private string $login = '';
private string $email = '';
private string $password = '';
private int $class = 0;
private array $classBonuses = [
1 => [
's1=62|s2=3|s3=3|s4=30|rinv=40|m9=5|m6=10|s7=0|a1=0|a2=9|a3=0|a4=0|a5=0|mg1=0|mg2=0|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=0|s6=0|a6=0|s8=0|s9=0|s10=0|s11=0|s12=0|s13=0|s14=0|s15=0',
'items' => [6433],
'effects' => [1, 20, 25, 37, 38, 283, 296, 412, 472],
],
2 => [
's1=21|s2=31|s3=16|s4=30|rinv=40|m9=5|m6=10|s7=0|a1=9|a2=0|a3=0|a4=0|a5=0|mg1=0|mg2=0|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=0|s6=0',
'items' => [6431],
'effects' => [8, 20, 25, 37, 38, 283, 296, 412, 472],
],
3 => [
's1=42|s2=3|s3=3|s4=50|rinv=40|m9=5|m6=10|s7=0|a1=0|a2=0|a3=9|a4=0|a5=0|mg1=0|mg2=0|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=0|s6=0|a6=0|s8=0|s9=0|s10=0|s11=0|s12=0|s13=0|s14=0|s15=0',
'items' => [6432],
'effects' => [1, 20, 25, 37, 38, 283, 296, 412, 472],
],
4 => [
's1=24|s2=15|s3=29|s4=30|rinv=40|m9=5|m6=10|s7=0|a1=0|a2=0|a3=0|a4=9|a5=0|mg1=0|mg2=0|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=0|s6=0|a6=0|s8=0|s9=0|s10=0|s11=0|s12=0|s13=0|s14=0|s15=0',
'items' => [6430],
'effects' => [7, 20, 25, 37, 38, 283, 296, 412, 472],
],
5 => [
's1=14|s2=3|s3=3|s4=25|rinv=40|m9=5|m6=10|s7=0|a1=0|a2=0|a3=0|a4=0|a5=3|mg1=0|mg2=6|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=13|s6=40|a6=0|s8=0|s9=0|s10=0|s11=0|s12=0|s13=0|s14=0|s15=0',
'items' => [6435],
'effects' => [9, 32, 53, 439, 25, 37, 38, 283, 296, 412, 472],
],
6 => [
's1=14|s2=3|s3=3|s4=25|rinv=40|m9=5|m6=10|s7=0|a1=0|a2=0|a3=0|a4=0|a5=3|mg1=6|mg2=0|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=13|s6=40|a6=0|s8=0|s9=0|s10=0|s11=0|s12=0|s13=0|s14=0|s15=0',
'items' => [6447],
'effects' => [9, 32, 51, 439, 25, 37, 38, 283, 296, 412, 472],
],
7 => [
's1=14|s2=3|s3=3|s4=25|rinv=40|m9=5|m6=10|s7=0|a1=0|a2=0|a3=0|a4=0|a5=3|mg1=0|mg2=0|mg3=0|mg4=6|mg5=0|mg6=0|mg7=0|s5=13|s6=40|a6=0|s8=0|s9=0|s10=0|s11=0|s12=0|s13=0|s14=0|s15=0',
'items' => [6436],
'effects' => [9, 32, 54, 439, 25, 37, 38, 283, 296, 412, 472],
],
8 => [
's1=14|s2=3|s3=3|s4=25|rinv=40|m9=5|m6=10|s7=0|a1=0|a2=0|a3=0|a4=0|a5=3|mg1=0|mg2=0|mg3=6|mg4=0|mg5=0|mg6=0|mg7=0|s5=13|s6=40|a6=0|s8=0|s9=0|s10=0|s11=0|s12=0|s13=0|s14=0|s15=0',
'items' => [6448],
'effects' => [9, 32, 52, 439, 25, 37, 38, 283, 296, 412, 472],
],
9 => [
's1=15|s2=23|s3=30|s4=30|rinv=40|m9=5|m6=10|s7=0|a1=9|a2=0|a3=0|a4=0|a5=0|mg1=0|mg2=0|mg3=0|mg4=0|mg5=0|mg6=0|mg7=0|s5=0|s6=0',
'items' => [6530],
'effects' => [8, 20, 25, 37, 38, 283, 296, 412, 472],
],
];
private array $restrictedLogins = [
'ангел', 'angel', 'администрация', 'administration', 'Комментатор',
'Мироздатель', 'Мусорщик', 'Падальщик', 'Повелитель',
'Архивариус', 'Пересмешник', 'Волынщик', 'Лорд Разрушитель',
'Милосердие', 'Справедливость', 'Искушение', 'Вознесение',
];
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): bool
{
$isRestricted = in_array($login, $this->restrictedLogins);
$isRegistered = Db::getValue('select count(*) from users where login = ?', [$login]);
//Бывшие в употреблении логины. Дичь, но ладно.
$wasRegistered = Db::getValue('select count(*) from lastnames where login = ?', [$login]);
$login = str_replace(' ', ' ', $login);
if (strlen($login) > 20) {
$this->error = 'Логин должен содержать не более 20 символов.';
}
if (strlen($login) < 4) {
$this->error = 'Логин должен содержать не менее 4 символов.';
}
if ($this->hasMixedLatCur($login)) {
$this->error = 'В логине разрешено использовать только буквы одного алфавита русского или английского. Нельзя смешивать.';
}
if (substr_count($login, ' ') + substr_count($login, '-') + substr_count($login, '_') > 2) {
$this->error = 'Не более двух разделителей одновременно (пробел, тире, нижнее подчеркивание).';
}
if (!empty($this->error)) {
$this->error .= '<br>Пример правильного никнейма: Петя Убиватор, Коля, xalop.<br>Пример неправильного никнейма: )))), kolя)=-/.';
}
if ($isRegistered || $wasRegistered || $isRestricted) {
$this->error = 'Логин ' . $login . ' уже занят, выберите другой.';
}
return !$this->error;
}
public function hasGoodEmail(string $email): bool
{
$isRegistered = Db::getValue('select count(*) from users where mail = ?', [$email]);
$isBlocked = Db::getValue('select count(*) from ban_email where email = ?', [$email]);
$allowedDomains = Db::getColumn('select email from trust_email');
if (!filter_var($email, FILTER_VALIDATE_EMAIL) || $isRegistered) {
$this->error = 'Неправильный email.';
}
if ($isBlocked) {
$this->error = 'Адрес заблокирован.';
}
if (!in_array(explode('@', $email)[1], $allowedDomains)) {
$this->error = 'Данный почтовый сервис использовать нельзя.';
}
return !$this->error;
}
public function hasGoodEmailCode(string $email, int $code): bool
{
$check = Db::getValue('select code from secure_code where email = ? order by time desc limit 1', [$email]);
if ($code !== $check) {
$this->error = 'Неверный проверочный код.';
} else {
Db::sql('delete from secure_code where email = ?', [$email]);
}
return !$this->error;
}
public function hasGoodPassword(string $password1, string $password2): bool
{
if ($password1 !== $password2) {
$this->error = 'Пароли не совпадают';
}
if (strlen($password1) < 8) {
$this->error = 'Пароль должен быть больше 8 символов';
}
return !$this->error;
}
public function new(string $login, string $password, string $email, $ref, $birthday, int $sex, int $class): string
{
if (!$this->hasGoodLogin($login)) { //fixme: грязный хак, но лучше не придумывается с этой пошаговостью.
return 0;
}
$this->class = $class;
$ip = UserIp::get();
$sex -= 10; //На входе 10\11, а передать надо 0\1.
Db::sql(
'insert into users
(`real`,login,host_reg,pass,ip,ipreg,room,timereg,mail,bithday,sex,fnq,molch2,level,clan_zv,money,online)
values (1,?,?,?,?,?,9,unix_timestamp(),?,?,?,0,unix_timestamp() + 86400,8,0,200,unix_timestamp())',
[
$this->login,
$ref ?? '',
$this->password,
$ip,
$ip,
$this->email,
date('d.m.Y', strtotime($birthday)),
$sex,
]
);
$uid = Db::lastInsertId();
$this->login = $login;
$this->setCookies();
$this->setStatsItemsEffects();
User::setOnline($uid);
Db::sql('insert into online (uid, timeStart) values (?,unix_timestamp())', [$uid]);
return $uid;
}
private function setCookies()
{
setcookie('login', 1, 1, '/', Config::get('host'), true);
setcookie('registrationModal', 1, 1, '/', Config::get('host'), true);
setcookie('login', $this->login, strtotime('+7 days'), '/', Config::get('host'), true);
setcookie('registrationModal', 'true', strtotime('+7 days'), '/', Config::get('host'), true);
}
private function setStatsItemsEffects()
{
$u = User::start();
$uid = (int)Db::lastInsertId();
if ($_SESSION['ref'] === 1) {
$this->classBonuses[$this->class]['items'][] = 4811;
}
Db::sql(
'insert into stats (id,stats,ability,skills,exp) values (?,?,-75,-9,100000)',
[
$uid,
$this->classBonuses[$this->class][0],
]
);
foreach ($this->classBonuses[$this->class]['items'] as $item) {
$itemId = $u->addItem($item, $uid);
Db::sql(
'update items_users
set `1price` = (select price_1 from items_shop where items_shop.item_id = ? and sid = 1)
where id = ?',
[$item, $itemId]
);
}
$this->addEffects($uid, $this->classBonuses[$this->class]['effects']);
}
private function addEffects(int $uid, int ...$eids)
{
$in = implode(',', $eids);
$q =
"insert into eff_users (
overType,
id_eff,
uid,
name,
timeUse,
data
)
select
oneType,
id2,
$uid,
mname,
unix_timestamp(),
mdata
from
eff_main
where
id2 in ($in)";
Db::sql($q);
}
/**
* @return string
*/
public function getError(): string
{
return $this->error;
}
}