<?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;
}
}
}