View file application/system/library/class.dialogs.php

File size: 8.05Kb
<?PHP
	class Dialogs {
		/*
			Создание диалога
		*/
		public function Create(array $userids = [], array $params = []) {
			try {
				if(isset($params['title'])) {
					$title = TextClear($params['title']);
					
					if(empty($title)) {
						throw new Exception(getLang('dialogs_fill'));
					}
				}
				else {
					$title = null;
				}
				
				$participants = [];
				
				foreach($userids as $key => $userid) {
					$participants += [
						$userid => [
							'access' => ($userid == $_SESSION['id']) ? '1' : '0',
							'date_enter' => time()
						]
					];
				}
				
				$sth = pdo()->prepare('INSERT INTO `messages__dialogs`(`title`, `participants`, `date_active`, `date_create`) VALUES (:title, :participants, :date_active, :date_create)');
				$sth->execute([
					':title' => $title,
					':participants' => json_encode($participants),
					':date_active' => time(),
					':date_create' => time()
				]);
				
				return pdo()->lastInsertId();
			}
			catch(Exception $e) {
				throw new Exception($e->getMessage());
			}
		}
		
		/*
			Обновление сведений в Диалоге
		*/
		public function Update($peerid) {
			$sth = pdo()->prepare('UPDATE `messages__dialogs` SET `date_active`=:date_active WHERE `id`=:peerid LIMIT 1');
			$sth->execute([
				':date_active' => time(),
				':peerid' => $peerid
			]);
		}
		
		/*
			Считывание данных
		*/
		public function GetData($peerid) {
			$mem_key = 'dlg_data_' . $peerid;
			$mem_data = Memcached()->get($mem_key);
			
			if($mem_data) {
				return $mem_data;
			}
			
			$sth = pdo()->prepare('SELECT * FROM `messages__dialogs` WHERE `id`=:id LIMIT 1');
			$sth->execute([
				':id' => $peerid
			]);
			
			if(!$sth->rowCount()) {
				return null;
			}
			
			$Dialog = $sth->fetch(PDO::FETCH_OBJ);
			$mem_data = json_decode($Dialog->participants, true);
			Memcached()->set($mem_key, $mem_data, 3600);
			
			return $mem_data;
		}
		
		/*
			Получение GUI диалогов
		*/
		public function GetDialogs() {
			$sth = pdo()->query('SELECT * FROM `messages__dialogs` ORDER BY `date_active` DESC');
			
			if(!$sth->rowCount()) {
				return '<p class="NoDialog">' . getLang('dialogs_not') . '</p>';
			}
				
			$Messages = new Messages;
			
			while($Dialog = $sth->fetch(PDO::FETCH_OBJ)) {
				if(empty($Dialog->title)) {
					$participants = json_decode($Dialog->participants, true);
					
					if(isset($participants[$_SESSION['id']])) {
						foreach($participants as $userid => $info) {
							if($userid != $_SESSION['id']) {
								$UserData = users()->Get($userid);
								
								if(empty($UserData)) {
									continue;
								}
								
								$mem_key = 'dlg_gets_' . $userid;
								$mem_data = Memcached()->get($mem_key);
								
								if($mem_data) {
									tpl()->AddCell('Dialogs', $mem_data);
									continue;
								}
								
								$mem_data = tpl()->Set([
									'{userid}' => $userid,
									'{login}' => $UserData->login,
									'{peerid}' => $Dialog->id,
									'{image}' => $UserData->image,
									'{message}' => $Messages->GetLastMessage($Dialog->id),
									'{first_name}' => isset($Dialog->title) ? $Dialog->title : $UserData->first_name,
									'{last_name}' => isset($Dialog->title) ? '' : $UserData->last_name,
									'{date}' => $Messages->GetLastDate($Dialog->id),
									'{not_ready}' => $Messages->rowNotReady($Dialog->id),
									'{online}' => isset($Dialog->title) ? '' : (users()->isOnline($UserData->id) ? 'yes' : '')
								], tpl()->Get('elements/messenger/dialog'));
								
								Memcached()->set($mem_key, $mem_data, 300);
								tpl()->AddCell('Dialogs', $mem_data);
								
								break;
							}
						}
					}
				}
				else {
					tpl()->AddCell('Dialogs', tpl()->Set([
						'{userid}' => '',
						'{login}' => '',
						'{peerid}' => $Dialog->id,
						'{image}' => 'no_image.jpg',
						'{message}' => $Messages->GetLastMessage($Dialog->id),
						'{first_name}' => $Dialog->title,
						'{last_name}' => isset($Dialog->title) ? '' : $UserData->last_name,
						'{date}' => $Messages->GetLastDate($Dialog->id),
						'{not_ready}' => $Messages->rowNotReady($Dialog->id)
					], tpl()->Get('elements/messenger/dialog')));
				}
			}
				
			return tpl()->Execute(
				tpl()->GetCell('Dialogs')
			);
		}
		
		/*
			Получение диалога
		*/
		public function Get($id) {
			$mem_key = 'dlg_get_' . $id;
			$mem_data = Memcached()->get($mem_key);
			
			if($mem_data) {
				return $mem_data;
			}
			
			try {
				$sth = pdo()->prepare('SELECT * FROM `messages__dialogs` WHERE `id`=:id LIMIT 1');
				$sth->execute([':id' => $id]);
				
				if(!$sth->rowCount()) {
					return null;
				}
				
				$mem_data = $sth->fetch(PDO::FETCH_OBJ);
				Memcached()->set($mem_key, $mem_data, 300);
				
				return $mem_data;
			}
			catch(Exception $e) {
				return null;
			}
		}
		
		/*
			Получение активного диалога
		*/
		public function GetDialog($id) {
			$mem_key = 'dlg_act_' . $id;
			$mem_data = Memcached()->get($mem_key);
			
			if($mem_data) {
				return $mem_data;
			}
			
			$sth = pdo()->prepare('SELECT * FROM `messages__dialogs` WHERE `id`=:id LIMIT 1');
			$sth->execute([
				':id' => $id
			]);
			
			$conf = ['title' => '', 'image' => ''];
			
			while($Dialog = $sth->fetch(PDO::FETCH_OBJ)) {
				if(empty($Dialog->title)) {
					$participants = json_decode($Dialog->participants, true);
					
					foreach($participants as $userid => $info) {
						if($userid != $_SESSION['id']) {
							$UserData = users()->Get($userid);
							$conf = ['title' => $UserData->first_name . ' ' . $UserData->last_name, 'image' => $UserData->image];
						}
					}
				}
				else {
					$conf = ['title' => $Dialog->title, 'image' => 'no_image.jpg'];
					break;
				}
			}
			
			Memcached()->set($mem_key, $conf, 300);
			return $conf;
		}
		
		/*
			Проверка на участие в диалоге пользователя
		*/
		public function IsUserPeer($peerid) {
			$mem_key = 'dlg_ispeer_' . $peerid . '_' . $_SESSION['id'];
			$mem_data = Memcached()->get($mem_key);
			
			if($mem_data) {
				return $mem_data;
			}
			
			$sth = pdo()->prepare('SELECT * FROM `messages__dialogs` WHERE `id`=:id LIMIT 1');
			$sth->execute([':id' => $peerid]);
			
			if(!$sth->rowCount()) {
				return false;
			}
			
			$Dialog = $sth->fetch(PDO::FETCH_OBJ);
			$participants = json_decode($Dialog->participants, true);
			
			$mem_data = isset($participants[$_SESSION['id']]);
			Memcached()->set($mem_key, $mem_data, 3600);
			
			return $mem_data;
		}
		
		/*
			Получение прав пользователя
		*/
		public function getUserAccess($peerid) {
			$mem_key = 'dlg_getaccess_' . $peerid . '_' . $_SESSION['id'];
			$mem_data = Memcached()->get($mem_key);
			
			if($mem_data) {
				return $mem_data;
			}
			
			$sth = pdo()->prepare('SELECT * FROM `messages__dialogs` WHERE `id`=:id LIMIT 1');
			$sth->execute([':id' => $peerid]);
			
			if(!$sth->rowCount()) {
				return 0;
			}
			
			$Dialog = $sth->fetch(PDO::FETCH_OBJ);
			$participants = json_decode($Dialog->participants, true);
			
			$mem_data = $participants[$_SESSION['id']]['access'];
			Memcached()->set($mem_key, $mem_data, 3600);
			
			return $mem_data;
		}
		
		/*
			Поиск Пиров
		*/
		public function findPeer($userid) {
			if(empty($userid)) {
				return null;
			}
			
			try {
				$sth = pdo()->query('SELECT * FROM `messages__dialogs`');
				
				if(!$sth->rowCount()) {
					return null;
				}
				
				while($Dialog = $sth->fetch(PDO::FETCH_OBJ)) {
					$participants = json_decode($Dialog->participants, true);
					
					if(sizeof($participants) == 2) {
						if(isset($participants[$_SESSION['id']]) AND isset($participants[$userid])) {
							return $Dialog;
						}
					}
				}
				
				return null;
			}
			catch(Exception $e) {
				return null;
			}
		}
	}