<?php
class User{
static private $instance = NULL;
public $user = array();
public $userOld = array();
public $auth = false;
public $cron = false;
public $isAdmin = false;
public $isSupport = false;
public $isModer = false;
public $isBlock = false;
public $isBan = false;
private $db = false;
public $score;
public $score_need;
public $join = '`users`.`nick`,`users`.`sex`,`users`.`date_last`,`users`.`level`,`users`.`status`,`users`.`IdCompany`,`users`.`ban`,`users`.`vip`';
public function __construct(){
$this->db = DB::a()->d;
}
static function a(){
if(self::$instance==NULL)self::$instance=new User();
return self::$instance;
}
public function start(){
$result = false;
if(isset($_COOKIE['hash']))$hash = strip_tags($_COOKIE['hash']);
if(isset($_COOKIE['id']))$id = abs(intval($_COOKIE['id']));
if(isset($_SESSION['hash']))$hash = strip_tags($_SESSION['hash']);
if(isset($_SESSION['user']))$id = abs(intval($_SESSION['user']));
if(!empty($hash))
{
$stmt = $this->db->prepare("SELECT `users`.* ,`Company`.* ,
`setting`.`count_online`,
`setting`.`count_users`,
`setting`.`count_chat`,
`setting`.`action`,
`setting`.`actionTime`,
`setting`.`idTender`,
`setting`.`timeTender`,
`setting`.`countTopics`,
`setting`.`countMessage`
FROM `users`
INNER JOIN `setting`
LEFT JOIN `Company` ON `Company`.`cid` = `users`.`IdCompany`
WHERE ".(isset($id)?"`users`.`id` = :id AND ":NULL)."`users`.`hash` = :hash ");
$stmt->bindParam(':hash', $_COOKIE['hash'] ,PDO::PARAM_STR);
if(isset($id))$stmt->bindParam(':id', $id ,PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetch();
}
if($result===FALSE)return false;
$_SESSION['user'] = $result['id'];
$_SESSION['hash'] = $hash;
$this->userOld = $result;
$this->user = $result;
$this->auth = TRUE;
$this->level();
if($result['counts']=='')$this->user['counts']= json_encode(array("exchange"=>0,"chat"=>0,"chat_group"=>0,"forums"=>0,"topics"=>0));
/*Баны*/
if($result['ban'] == '')$banStatus = array('type'=>0,'time'=>0,'who'=>0,'why'=>0);
else $banStatus = json_decode($result['ban'],true);
if($banStatus['type']==2){
echo"<div style='text-align:center;font-size:20px;color:#ff0000;margin-top:25%'>Вам выдали изгнание!</div>";
die();
}
if($banStatus['time']>time()){
$this->isBan = true;
}
/*Пустой ник*/
if(empty($this->user['nick']))$this->user['nick']="Гость";
/*Установка дня двойного опыта*/
if(empty($result['doubleDay'])){
$days=array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday');
$day=array_rand($days);
return $this->user['doubleDay']=$days[$day];
}
/*Информация о пользователе*/
if(empty($result['userInfo']))$this->user['userInfo']= json_encode(array("name"=>'',"city"=>'',"birthday"=>'',"osebe"=>'','change_nick' => 0));
if($result['status']>2)$this->isAdmin = true;
if($result['status']>1)$this->isSupport = true;
if($result['status']>0)$this->isModer = true;
/*Логи*/
for($i=3;$i<=14;$i++){
$date = date("d-m-y",strtotime("- ".$i."day"));
if(file_exists('data/logs/'.$result['id'].'_'.$date))unlink('data/logs/'.$result['id'].'_'.$date);
}
/*Бонус*/
if($this->user['bonus']<time()){
$url_param = Module::a()->url;
if($url_param[0]!='Bonus'){
header("Location:/Bonus/");
die();
}
}
/*Магазин*/
if(empty($result['dataShop'])){
$dataUserShop = array();
$dataShop=Shop::a()->data;
foreach($dataShop as $key => $value){
$dataUserShop[$value['eng']] = array('id'=> $key,'level'=>0);
}
$this->user['dataShop'] = json_encode($dataUserShop);
}else{
$dataUserShop= json_decode($result['dataShop'],true);
$dataShop=Shop::a()->data;
$lvl=0;
foreach($dataShop as $key=>$value){
if(!array_key_exists($value['eng'],$dataUserShop)){
$dataUserShop[$value['eng']] = array('id'=> $key,'level'=>0);
}else{
$lvl+=$dataUserShop[$value['eng']]['level'];
}
}
$this->user['dataShop'] = json_encode($dataUserShop);
$this->user['countTech'] = $lvl;
}
/*Работники*/
if(empty($result['dataWorkers'])){
$dataUserWorkers = array();
$dataWorkers = Workers::a()->data;
foreach($dataWorkers as $key => $value){
$dataUserWorkers[$value['eng']] = array('id'=> $key,'time'=>0);
}
$this->user['dataWorkers'] = json_encode($dataUserWorkers);
}else{
$dataUserWorkers= json_decode($result['dataWorkers'],true);
$dataWorkers= Workers::a()->data;
foreach($dataWorkers as $key=>$value){
if(!array_key_exists($value['eng'],$dataUserWorkers)){
$dataUserWorkers[$value['eng']] = array('id'=> $key,'time'=>0);
}
}
/*Работники*/
$Lunapark = new Lunapark($this->user);
$Trade = new Trade($this->user);
$Tender = new Tender($this->user);
$date = date("Hi");
if($date!=2359 && $date!=0000) {
/*Лунапарк*/
if($dataUserWorkers['mechanic']['time']>time())$Lunapark->workerMechanic();
if($dataUserWorkers['kassir']['time']>time())$Lunapark->workerKassir();
/*Торговля*/
if($dataUserWorkers['oficiant']['time']>time())$Trade->workerOficiant();
if($dataUserWorkers['povar']['time']>time())$Trade->workerPovar();
if($dataUserWorkers['barmen']['time']>time())$Trade->workerBarmen();
/*Тендер*/
if($dataUserWorkers['smotrit']['time']>time())$Tender->workerSmotrit();
if($dataUserWorkers['uprav']['time']>time())$Tender->workerUprav();
$this->user['dataWorkers'] = json_encode($dataUserWorkers);
}
}
return true;
}
public function rebuildCount($location,$count){
$counts = json_decode($this->user['counts'],true);
$counts[$location] = $count;
$this->user['counts'] = json_encode($counts);
return true;
}
public function getSex($data=false){
if($data === false)$data = $this->user;
$sex = $this->getIcon($data);
if($data['sex']==0)return $sex."Мужской";
return $sex."Женский";
}
public function getAdminLevel($data=false){
if($data === false)$data = $this->user;
if($data['status']==1)return '<span class="nickModer">Модератор</span>';
if($data['status']==2)return '<span class="nickSupport">Ст.Модератор</span>';
if($data['status']==3)return '<span class="nickAdmin">Администратор</span>';
}
public function getStatus($data=false){
if($data === false)$data = $this->user;
if($data['date_last']>time()-TIME_ONLINE)return '<span style="color:#72eaad">Онлайн</span>';
return '<span style="color:#fd4d4d">Оффлайн</span>';
}
public function rusDay($day) {
return strtr($day,array('Monday' => 'Понедельник' ,'Tuesday' => 'Вторник','Wednesday' => 'Среда','Thursday' => 'Четверг','Friday' => 'Пятница','Saturday' => 'Суббота','Sunday' => 'Воскресенье'));
}
public function colors($data){
if($data['ban'] == '')$banStatus = array('type'=>0,'time'=>0,'who'=>0,'why'=>0);
else $banStatus = json_decode($data['ban'],true);
if($banStatus['type']==2)return array('nickIzg','nickIzg');
if($banStatus['type']==1 && $banStatus['time']>time())return array('nickBan','nickBan');
switch($data['status']){
case 0: return array('mess','nickUser');
case 1: return array('nickModer','nickModer');
case 2:
if($data['sex']==0)return array('nickM','nickM');
return array('nickSupport','nickSupport');
case 3: return array('nickAdmin','nickAdmin');
default: return array('mess','nickUser');
}
}
public function getLink($id,$data) {
$color = $this->colors($data);
$link=NULL;
$link.= "<span style='font-size:11px;vertical-align:bottom;color:#fff'>".$data['level']."</span><a class='".$color[1]."' style='font-size:16px;' href='/User/".$id."/'>";
$link.= $this->getIcon($data);
$link.= $data['nick'];
$link.= "</a>";
if($data['date_last']<time()-120 && $data['date_last']>time()-TIME_ONLINE)$link.= '<span class="small minor" style="font-size:12px;vertical-align:top">*</span>';
if($data['IdCompany']==0)$link.= '<img src="/img/icons/plus.png" style="margin-right:2px;width:14px">';
if($data['vip']==1)$link.= ' <img src="/img/vip2.png" style="margin-right:4px;width:30px">';
return $link;
}
public function getNick($id) {
$id = abs(intval($id));
$stmt = $this->db->prepare("SELECT `nick` FROM `users` WHERE `id` = :id LIMIT 1");
$stmt->bindParam(':id', $id ,PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetch();
if($result===FALSE)return false;
return $result['nick'].", ";
}
public function history($id,$text) {
$text = json_encode_cyr($text);
$stmt = $this->db->prepare("INSERT INTO `usersHistory` SET `user` = :id , `text` = :text , `time` = '".time()."'");
$stmt->bindParam(':id', $id ,PDO::PARAM_INT);
$stmt->bindParam(':text', $text ,PDO::PARAM_STR);
$stmt->execute();
return true;
}
public function historyCompany($id,$text) {
$text = json_encode_cyr($text);
$stmt = $this->db->prepare("INSERT INTO `CompanyHistory` SET `company` = :id , `text` = :text , `time` = '".time()."'");
$stmt->bindParam(':id', $id ,PDO::PARAM_INT);
$stmt->bindParam(':text', $text ,PDO::PARAM_STR);
$stmt->execute();
return true;
}
public function searchUser($nick=false,$email=false,$pass=false) {
if($email===false){
$value = htmlspecialchars(strip_tags(trim($nick)));
$col = 'nick';
}
if($nick===false){
$value = htmlspecialchars(strip_tags(trim($email)));
$col = 'email';
}
$stmt = $this->db->prepare("SELECT `id`,`hash` FROM `users` WHERE `".$col."` = :value ".($pass!==false?"AND `password` = :pass":NULL)." LIMIT 1");
$stmt->bindParam(':value', $value ,PDO::PARAM_STR);
if($pass!==false){
$pass = htmlspecialchars(strip_tags(trim($pass)));
$stmt->bindParam(':pass', $pass ,PDO::PARAM_STR);
}
$stmt->execute();
$result = $stmt->fetch();
if($result===FALSE)return false;
return $result;
}
public function getMess($data,$text) {
$color = $this->colors($data);
/*Обработка текста*/
$text = preg_replace("/(\r\n)+/i", "<br/>", $text);
/*Смайлики*/
foreach(Setting::a()->smiles as $value){
$text = str_replace($value[0],$value[1],$text);
}
/*Ссылки*/
foreach(Setting::a()->links as $value){
$text = str_replace($value[0],$value[1],$text);
}
$text = str_replace(':bucks:','<img src="/img/icons/donate.png" style="margin-right:2px">',$text);
$text = str_replace(':money:','<img src="/img/icons/money.png" style="margin-right:2px">',$text);
/*Обращение*/
$text = str_replace(User::a()->user['nick'],"<span style='color:#7fd1e3'>".User::a()->user['nick']."</span>",$text);
return "<div class='".$color[0]."' style='font-size:16px;margin-top:2px;'>".BBcode($text,$data['status'])."</div>";
}
public function getIcon($data = false) {
if($data == false) {
$data = $this->user;
}
if($data['level'] >= 100) {
return '<img src="/img/users/'.($data['sex'] == 1 ? 'fe' : '').'male_100.png" '.(($data['date_last'] + TIME_ONLINE < time()) ? 'style="opacity:0.4;margin-right:2px"' : 'style="margin-right:2px"').'/>';
}
if($data['level'] >= 90) {
return '<img src="/img/users/'.($data['sex'] == 1 ? 'fe' : '').'male_90.png" '.(($data['date_last'] + TIME_ONLINE < time()) ? 'style="opacity:0.4;margin-right:2px"' : 'style="margin-right:2px"').'/>';
}
if($data['level'] >= 85) {
return '<img src="/img/users/'.($data['sex'] == 1 ? 'fe' : '').'male_85.png" '.(($data['date_last'] + TIME_ONLINE < time()) ? 'style="opacity:0.4;margin-right:2px"' : 'style="margin-right:2px"').'/>';
}
if($data['level'] >= 75) {
return '<img src="/img/users/'.($data['sex'] == 1 ? 'fe' : '').'male_75.png" '.(($data['date_last'] + TIME_ONLINE < time()) ? 'style="opacity:0.4;margin-right:2px"' : 'style="margin-right:2px"').'/>';
}
if($data['level'] >= 65) {
return '<img src="/img/users/'.($data['sex'] == 1 ? 'fe' : '').'male_65.png" '.(($data['date_last'] + TIME_ONLINE < time()) ? 'style="opacity:0.4;margin-right:2px"' : 'style="margin-right:2px"').'/>';
}
if($data['level'] >= 60) {
return '<img src="/img/users/'.($data['sex'] == 1 ? 'fe' : '').'male_60.png" '.(($data['date_last'] + TIME_ONLINE < time()) ? 'style="opacity:0.4;margin-right:2px"' : 'style="margin-right:2px"').'/>';
}
if($data['level'] >= 50) {
return '<img src="/img/users/'.($data['sex'] == 1 ? 'fe' : '').'male_50.png" '.(($data['date_last'] + TIME_ONLINE < time()) ? 'style="opacity:0.4;margin-right:2px"' : 'style="margin-right:2px"').'/>';
}
if($data['level'] >= 40) {
return '<img src="/img/users/'.($data['sex'] == 1 ? 'fe' : '').'male_40.png" '.(($data['date_last'] + TIME_ONLINE < time()) ? 'style="opacity:0.4;margin-right:2px"' : 'style="margin-right:2px"').'/>';
}
if($data['level'] >= 30) {
return '<img src="/img/users/'.($data['sex'] == 1 ? 'fe' : '').'male_30.png" '.(($data['date_last'] + TIME_ONLINE < time()) ? 'style="opacity:0.4;margin-right:2px"' : 'style="margin-right:2px"').'/>';
}
if($data['level'] >= 20) {
return '<img src="/img/users/'.($data['sex'] == 1 ? 'fe' : '').'male_20.png" '.(($data['date_last'] + TIME_ONLINE < time()) ? 'style="opacity:0.4;margin-right:2px"' : 'style="margin-right:2px"').'/>';
}
if($data['level'] >= 10) {
return '<img src="/img/users/'.($data['sex'] == 1 ? 'fe' : '').'male_10.png" '.(($data['date_last'] + TIME_ONLINE < time()) ? 'style="opacity:0.4;margin-right:2px"' : 'style="margin-right:2px"').'/>';
}
return '<img src="/img/users/'.($data['sex'] == 1 ? 'fe' : '').'male_1.png" '.(($data['date_last'] + TIME_ONLINE < time()) ? 'style="opacity:0.4;margin-right:2px"' : 'style="margin-right:2px"').'/>';
}
public function login($id,$hash,$subAction = false) {
$this->auth = true;
@SetCookie('id', $id, time() + 86400 * 360, '/');
@SetCookie('hash', $hash, time() + 86400 * 360, '/');
$_SESSION['user'] = $id;
$_SESSION['hash'] = $hash;
if($subAction !== false){
DB::a()->d->query("UPDATE `users` SET `odk_session_secret_key` = '".$subAction->showSecretKey()."',`odk_session` = '".$subAction->showSessionKey()."' WHERE `id` = '".$id."' LIMIT 1");
}
return true;
}
public function isLogin(){
if($this->auth === true){
header("Location:/Lunapark/");
die();
}
}
public function noLogin(){
if($this->auth === False){
header("Location:/");
die();
}
}
public function format($var)
{
return number_format($var, 0, '', ',');
}
public function update($newData = false , $oldData = false , $uid = false) {
if($this->auth === false && $this->cron===false) return false;
if($newData == false && $oldData == false && $uid == false) {
$newData = $this->user;
$oldData = $this->userOld;
$uid = $this->userOld['id'];
}
if($this->auth == true) {
$query = "`date_last` = '".time()."', `in_game` = `in_game` + 1 ".($oldData['date_last']!=time()?",`tOnline` = `tOnline` + 1":NULL)."";
}
foreach($oldData as $key => $value) {
if($newData[$key] != $value) {
$query .= "".($query == false ? "" : ",")." `".$key."` = '".$newData[$key]."'";
}
}
DB::a()->d->query("UPDATE `users` SET ".$query." WHERE `id` = '".$uid."' LIMIT 1");
return true;
}
public function addLog($text){
if(!file_exists('data/logs/'.User::a()->user['id'].'_'.date("d-m-y")))$data = false;
else $data = json_decode(file_get_contents('data/logs/'.User::a()->user['id'].'_'.date("d-m-y")),true);
if($data==false){
$data = array(array('text'=>$text,'time'=>time()));
}else{
$data[] = array('text'=>$text,'time'=>time());
}
$data_mailMe = json_encode($data);
file_put_contents('data/logs/'.User::a()->user['id'].'_'.date("d-m-y"),$data_mailMe);
return true;
}
public function getLog($id,$data,$page){
if(!file_exists('data/logs/'.$id.'_'.$data))$data = false;
else $data = json_decode(file_get_contents('data/logs/'.$id.'_'.$data),true);
if(count($data)==0 || $data==false)return false;
krsort($data);
$logs = array();
foreach($data as $key=>$value){
$logs[]=$value;
}
if(count($logs)==0)return false;
$total=count($logs);
if(!$page) $page = 1;
$page = abs(intval($page));
if($page == 1)$start = 1;
else $start = 20*($page-1)+1;
$log=array();
for($i=$start;$i<=20*$page;$i++){
if(array_key_exists($i-1,$logs))
{
$log[]=$logs[$i-1];
}
}
if(count($log)==0)header('Location:/User/'.$id.'/Logs/');
return array('logs' => $log , 'total'=>$total);
}
public function level() {
$rating = rating($this->user['rating']);
if($this->user['level'] != $rating[2]) {
Jobs::a($this->user)->searchJob('Новый уровень','Любой',1);
$this->user['money'] += $rating[2] * 100;
$this->user['donate'] += $rating[2];
$this->user['level'] = $rating[2];
if($this->user['ref']!=0){
DB::a()->d->query("UPDATE `users` SET `donate` = `donate` + 50 WHERE `id` = '".$this->user['ref']."' LIMIT 1");
}
$rand = rand(1,3);
switch($rand){
case 1:
$gtext = "Поздравляю с новым уровнем :) Приятной игры :)";
$present = 41;
break;
case 2:
$gtext = "С новым уровнем :) Так держать :)";
$present = 33;
break;
case 3:
$gtext = "С ".$rating[2]."-м уровнем :);)";
$present = 26;
break;
}
Gift::a()->add($this->user['id'],1,$present,$gtext);
$text = "Получил за новый уровень <img src='/img/icons/donate.png' style='margin-right:2px;width:14px'>".$rating[2]." и <img src='/img/icons/money.png' style='margin-right:2px;width:14px'>".($rating[2]*1000);
User::a()->addLog($text);
$_SESSION['info'] = 'Вы перешли на новый уровень <img src="/img/icons/star.png" />'.$rating[2].'. <br/> Награда <img src="/img/icons/donate.png" style="margin-right:2px;width:14px">'.$rating[2].' и <img src="/img/icons/money.png" style="margin-right:2px;width:14px">'.($rating[2] * 100);
}
$this->score = $rating[1];
$this->score_need = $rating[0];
return true;
}
public function __destruct() {
$this->update();
}
}