<?php
if(!defined("MCR")){ exit("Hacking Attempt!"); }
class user{
	// Set default system vars
	private $core, $db, $cfg, $lng;
	// Set default user vars
	public $email, $login, $login_v2, $group, $group_v2, $uuid, $group_desc, $password, $salt, $tmp, $ip, $ip_create, $data, $permissions, $permissions_v2;
	public $gender = 0;
	public $time_create = 0;
	public $time_last = 0;
	public $firstname = '';
	public $lastname = '';
	public $birthday = 0;
	public $id = 0;
	public $is_auth = false;
	public $is_skin = false;
	public $is_cloak = false;
	public $skin = 'default';
	public $cloak = '';
	public $money= 0;
	public $realmoney = 0;
	public $bank = 0;
	public $gid = -1;
	public $auth;
	public function __construct($core){
		$this->core			= $core;
		$this->db			= $core->db;
		$this->cfg			= $core->cfg;
		$this->lng			= $core->lng;
		$this->login		= $this->lng['u_group_def'];
		$this->group		= $this->lng['u_group_def'];
		$this->group_desc	= $this->lng['u_group_desc_def'];
		// Set now ip
		$this->ip			= $this->ip();
		$this->auth			= $this->load_auth();
		// Check cookies
		if(!isset($_COOKIE['mcr_user'])){
			$perm_ar = @$this->get_default_permissions();
			$this->permissions = $perm_ar[0];
			$this->permissions_v2 = $perm_ar[1];
			return false;
		}
		$cookie	= explode("_", $_COOKIE['mcr_user']);
		if(!isset($cookie[0], $cookie[1])){ $this->set_unauth(); $this->core->notify(); }
		$uid	= intval($cookie[0]);
		$hash	= $cookie[1];
		$ctables	= $this->cfg->db['tables'];
		$ug_f	= $ctables['ugroups']['fields'];
		$us_f	= $ctables['users']['fields'];
		$ic_f	= $ctables['iconomy']['fields'];
		$query = $this->db->query("SELECT `u`.`{$us_f['group']}`, `u`.`{$us_f['login']}`, `u`.`{$us_f['email']}`, `u`.`{$us_f['pass']}`, `u`.`{$us_f['salt']}`,
											`u`.`{$us_f['tmp']}`, `u`.`{$us_f['ip_create']}`, `u`.`{$us_f['date_reg']}`, `u`.`{$us_f['date_last']}`,
											`u`.`{$us_f['fname']}`, `u`.`{$us_f['lname']}`, `u`.`{$us_f['gender']}`, `u`.`{$us_f['bday']}`,
											`u`.`{$us_f['is_skin']}`, `u`.`{$us_f['is_cloak']}`, `u`.`{$us_f['color']}`, `u`.`{$us_f['uuid']}`,
											`g`.`{$ug_f['title']}`, `g`.`{$ug_f['text']}`, `g`.`{$ug_f['perm']}`, `g`.`{$ug_f['color']}` AS `gcolor`,
											`i`.`{$ic_f['money']}`, `i`.`{$ic_f['rm']}`, `i`.`{$ic_f['bank']}`
									FROM `{$this->cfg->tabname('users')}` AS `u`
									INNER JOIN `{$this->cfg->tabname('ugroups')}` AS `g`
										ON `g`.`{$ug_f['id']}`=`u`.`{$us_f['group']}`
									LEFT JOIN `{$this->cfg->tabname('iconomy')}` AS `i`
										ON `i`.`{$ic_f['login']}`=`u`.`{$us_f['login']}`
									WHERE `u`.`{$us_f['id']}`='$uid'");
		if(!$query || $this->db->num_rows($query)<=0){ $this->set_unauth(); $this->core->notify(); }
		$ar			= $this->db->fetch_assoc($query);
		$tmp		= $this->db->HSC($ar[$us_f['tmp']]);
		$password	= $this->db->HSC($ar[$us_f['pass']]);
		$new_hash	= $uid.$tmp.$this->ip.md5($this->cfg->main['mcr_secury']);
		$ar_hash	= $uid.'_'.md5($new_hash);
		// Check security auth
		if($_COOKIE['mcr_user'] !== $ar_hash){ $this->set_unauth(); $this->core->notify(); }
		$login				= $this->db->HSC($ar[$us_f['login']]);
		$color				= (!empty($ar[$us_f['color']])) ? $this->db->HSC($ar[$us_f['color']]) : $this->db->HSC($ar['gcolor']);
		$group				= $this->db->HSC($ar[$ug_f['title']]);
		$gcolor				= $this->db->HSC($ar['gcolor']);
		// Identificator
		$this->id			= $uid;
		// Group identificator
		$this->gid			= intval($ar[$us_f['group']]);
		// Username
		$this->login		= $login;
		// Username
		$this->login_v2		= $this->core->colorize($login, $color);
		// E-Mail
		$this->email		= $this->db->HSC($ar[$us_f['email']]);
		// UUID
		$this->uuid			= $this->db->HSC($ar[$us_f['uuid']]);
		// Password hash
		$this->password		= $password;
		// Salt of password
		$this->salt			= $ar[$us_f['salt']];
		// Temp hash
		$this->tmp			= $tmp;
		// Register ip
		$this->ip_create	= $this->db->HSC($ar[$us_f['ip_create']]);
		// Group title
		$this->group		= $group;
		// Group title with colorize
		$this->group_v2		= $this->core->colorize($group, $gcolor);
		// Group description
		$this->group_desc	= $this->db->HSC($ar[$ug_f['text']]);
		// Permissions
		$this->permissions	= @json_decode($ar[$ug_f['perm']]);
		// Permissions
		$this->permissions_v2	= @json_decode($ar[$ug_f['perm']], true);
		// Is auth status
		$this->is_auth		= true;
		// Is default skin
		$this->is_skin		= (intval($ar[$us_f['is_skin']])==1) ? true : false;
		// Is isset cloak
		$this->is_cloak		= (intval($ar[$us_f['is_cloak']])==1) ? true : false;
		$this->skin			= ($this->is_skin || $this->is_cloak) ? $this->login : 'default';
		$this->cloak		= ($this->is_cloak) ? $this->login : '';
		// Gender
		$this->gender		= (intval($ar[$us_f['gender']])==1 || $ar[$us_f['gender']]=='female') ? $this->lng['gender_w'] : $this->lng['gender_m'];
		$this->time_create	= intval($ar[$us_f['date_reg']]);
		$this->time_last	= intval($ar[$us_f['date_last']]);
		$this->firstname	= $this->db->HSC($ar[$us_f['fname']]);
		$this->lastname		= $this->db->HSC($ar[$us_f['lname']]);
		$this->birthday		= intval($ar[$us_f['bday']]);
		// Game money balance
		$this->money		= floatval($ar[$ic_f['money']]);
		// Real money balance
		$this->realmoney	= floatval($ar[$ic_f['rm']]);
		// Bank money balance (for plugins)
		$this->bank			= floatval($ar[$ic_f['bank']]);
	}
	private function load_auth(){
		if(!file_exists(MCR_LIBS_PATH.'auth/'.$this->cfg->main['p_logic'].'.php')){ exit('Auth Type Error!'); }
		require_once(MCR_LIBS_PATH.'auth/'.$this->cfg->main['p_logic'].'.php');
		return new auth($this->core);
	}
	public function logintouuid($string){
		$string = "OfflinePlayer:".$string;
		$val = md5($string, true);
		$byte = array_values(unpack('C16', $val));
		$tLo = ($byte[0] << 24) | ($byte[1] << 16) | ($byte[2] << 8) | $byte[3];
		$tMi = ($byte[4] << 8) | $byte[5];
		$tHi = ($byte[6] << 8) | $byte[7];
		$csLo = $byte[9];
		$csHi = $byte[8] & 0x3f | (1 << 7);
		if (pack('L', 0x6162797A) == pack('N', 0x6162797A)) {
			$tLo = (($tLo & 0x000000ff) << 24) | (($tLo & 0x0000ff00) << 8) | (($tLo & 0x00ff0000) >> 8) | (($tLo & 0xff000000) >> 24);
			$tMi = (($tMi & 0x00ff) << 8) | (($tMi & 0xff00) >> 8);
			$tHi = (($tHi & 0x00ff) << 8) | (($tHi & 0xff00) >> 8);
		}
		$tHi &= 0x0fff;
		$tHi |= (3 << 12);
		$uuid = sprintf(
			'%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x',
			$tLo, $tMi, $tHi, $csHi, $csLo,
			$byte[10], $byte[11], $byte[12], $byte[13], $byte[14], $byte[15]
		);
		return $uuid;
	}
	public function update_default_permissions(){
		$query = $this->db->query("SELECT `value`, `type`, `default` FROM `mcr_permissions`");
		if(!$query || $this->db->num_rows($query)<=0){ return; }
		$array = array();
		while($ar = $this->db->fetch_assoc($query)){
			switch($ar['type']){
				case 'integer':
					$array[$ar['value']] = intval($ar['default']);
				break;
				case 'float':
					$array[$ar['value']] = floatval($ar['default']);
				break;
				case 'string':
					$array[$ar['value']] = $this->db->safesql($ar['default']);
				break;
				default:
					$array[$ar['value']] = ($ar['default']=='true') ? true : false;
				break;
			}
		}
		$permissions = json_encode($array);
		@file_put_contents(MCR_CACHE_PATH.'permissions', $permissions);
		return $permissions;
	}
	public function get_default_permissions(){
		if(file_exists(MCR_CACHE_PATH.'permissions')){
			$json = file_get_contents(MCR_CACHE_PATH.'permissions');
			$array = json_decode($json, true);
			$object = json_decode($json);
			return array($object, $array);
		}
		$permissions = @$this->update_default_permissions();
		return array(json_decode($permissions), json_decode($permissions, true));
	}
	public function set_unauth(){
		if(isset($_COOKIE['mcr_user'])){ setcookie("mcr_user", "", time()-3600, '/'); }
		return true;
	}
	private function ip(){
		if(!empty($_SERVER['HTTP_CF_CONNECTING_IP'])){
			$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
		}elseif(!empty($_SERVER['HTTP_X_REAL_IP'])){
			$ip = $_SERVER['HTTP_X_REAL_IP'];
		}elseif(!empty($_SERVER['HTTP_CLIENT_IP'])){
			$ip = $_SERVER['HTTP_CLIENT_IP'];
		}elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
			$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
		}else{
			$ip = $_SERVER['REMOTE_ADDR'];
		}
		return mb_substr($ip, 0, 16, "UTF-8");
	}
}
?>