%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/im/lib/replica/ |
| Current File : /home/bitrix/www/bitrix/modules/im/lib/replica/relationhandler.php |
<?php
namespace Bitrix\Im\Replica;
use Bitrix\Main\Loader;
if (Loader::includeModule('replica'))
{
class RelationHandler extends \Bitrix\Replica\Client\BaseHandler
{
protected $tableName = "b_im_relation";
protected $moduleId = "im";
protected $className = "\\Bitrix\\Im\\Model\\RelationTable";
protected $primary = array(
"ID" => "auto_increment",
);
protected $predicates = array(
"CHAT_ID" => "b_im_chat.ID",
"USER_ID" => "b_user.ID",
);
protected $translation = array(
"ID" => "b_im_relation.ID",
"CHAT_ID" => "b_im_chat.ID",
"USER_ID" => "b_user.ID",
"START_ID" => "b_im_message.ID",
"LAST_ID" => "b_im_message.ID",
"LAST_SEND_ID" => "b_im_message.ID",
);
protected $fields = array(
"LAST_READ" => "datetime",
);
/**
* Method will be invoked before new database record inserted.
* When an array returned the insert will be cancelled and map for
* returned record will be added.
*
* @param array &$newRecord All fields of inserted record.
*
* @return null|array
*/
public function beforeInsertTrigger(array &$newRecord)
{
if ($newRecord["CHAT_ID"] <= 0 || $newRecord["USER_ID"] <= 0)
{
return array("ID" => 0);
}
if (
isset($newRecord["MESSAGE_TYPE"])
&& $newRecord["MESSAGE_TYPE"] === "S"
)
{
$chatList = \Bitrix\Im\Model\RelationTable::getList(array(
"filter" => array(
"=USER_ID" => $newRecord["USER_ID"],
"=CHAT_ID" => $newRecord["CHAT_ID"],
"=MESSAGE_TYPE" => "S",
),
));
$oldRecord = $chatList->fetch();
if ($oldRecord)
{
return $oldRecord;
}
}
return null;
}
/**
* Called before update operation log write. You may return false and not log write will take place.
*
* @param array $record Database record.
*
* @return boolean
*/
public function beforeLogUpdate(array $record)
{
if ($record["MESSAGE_TYPE"] === "S")
return false;
else
return true;
}
/**
* Called before log write. You may return false and not log write will take place.
*
* @param array $record Database record.
* @return boolean
*/
public function beforeLogInsert(array $record)
{
if (\Bitrix\Im\User::getInstance($record["USER_ID"])->isBot())
{
return false;
}
else
{
return true;
}
}
/**
* Method will be invoked after an database record updated.
*
* @param array $oldRecord All fields before update.
* @param array $newRecord All fields after update.
*
* @return void
*/
public function afterUpdateTrigger(array $oldRecord, array $newRecord)
{
if (
$newRecord["MESSAGE_TYPE"] === "P"
&& intval($oldRecord["LAST_ID"]) < intval($newRecord["LAST_ID"])
)
{
$oldLastRead = $oldRecord["LAST_READ"] instanceof \Bitrix\Main\Type\DateTime? $oldRecord["LAST_READ"]: false;
$newLastRead = $newRecord["LAST_READ"] instanceof \Bitrix\Main\Type\DateTime? $newRecord["LAST_READ"]: false;
if ($oldLastRead < $newLastRead)
{
if (\Bitrix\Main\Loader::includeModule('pull'))
{
$relationList = \Bitrix\IM\Model\RelationTable::getList(array(
"select" => array("ID", "USER_ID"),
"filter" => array(
"=CHAT_ID" => $newRecord["CHAT_ID"],
"!=USER_ID" => $newRecord["USER_ID"],
),
));
if ($relation = $relationList->fetch())
{
\Bitrix\Pull\Event::add($relation['USER_ID'], Array(
'module_id' => 'im',
'command' => 'readMessageOpponent',
'expiry' => 3600,
'params' => Array(
'dialogId' => intval($newRecord['USER_ID']),
'chatId' => intval($newRecord['CHAT_ID']),
'userId' => intval($newRecord['USER_ID']),
'chatMessageStatus' => ''
),
'extra' => \Bitrix\Im\Common::getPullExtra()
));
}
}
}
}
}
}
}