static function Delete($id, $userId = null, $completeDelete = false, $byEvent = false)
{
$deleteFlags = Array(
'ID' => $id,
'USER_ID' => $userId,
'COMPLETE_DELETE' => $completeDelete,
'BY_EVENT' => $byEvent
);
$message = self::CheckPossibilityUpdateMessage(IM_CHECK_DELETE, $id, $userId);
if (!$message)
return false;
$deleteFlags['COMPLETE_DELETE'] = $completeDelete = $message['CHAT_ID'] == CIMChat::GetGeneralChatId() && self::IsAdmin()? true: $completeDelete;
$params = CIMMessageParam::Get($message['ID']);
if (!empty($params['FILE_ID']))
{
foreach ($params['FILE_ID'] as $fileId)
{
CIMDisk::DeleteFile($message['CHAT_ID'], $fileId);
}
}
$date = FormatDate("FULL", $message['DATE_CREATE']+CTimeZone::GetOffset());
if (!$completeDelete)
{
BitrixImModelMessageTable::update($message['ID'], array(
"MESSAGE" => GetMessage('IM_MESSAGE_DELETED'),
"MESSAGE_OUT" => GetMessage('IM_MESSAGE_DELETED_OUT', Array('#DATE#' => $date)),
));
CIMMessageParam::Set($message['ID'], Array('IS_DELETED' => 'Y', 'URL_ID' => Array(), 'FILE_ID' => Array(), 'KEYBOARD' => 'N', 'ATTACH' => Array()));
}
$arFields = $message;
$arFields['MESSAGE'] = GetMessage('IM_MESSAGE_DELETED_OUT', Array('#DATE#' => $date));
$arFields['DATE_MODIFY'] = new BitrixMainTypeDateTime();
$relations = CIMMessenger::GetRelationById($message['ID']);
$arPullMessage = Array(
'id' => (int)$arFields['ID'],
'type' => $arFields['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE? 'private': 'chat',
'text' => GetMessage('IM_MESSAGE_DELETED'),
'params' => Array('IS_DELETED' => 'Y', 'URL_ID' => Array(), 'FILE_ID' => Array(), 'KEYBOARD' => 'N', 'ATTACH' => Array())
);
$arBotInChat = Array();
if ($message['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE)
{
$arFields['FROM_USER_ID'] = $arFields['AUTHOR_ID'];
$arFields['TO_USER_ID'] = $arFields['AUTHOR_ID'];
foreach ($relations as $rel)
{
if ($rel['USER_ID'] != $arFields['AUTHOR_ID'])
$arFields['TO_USER_ID'] = $rel['USER_ID'];
}
$arPullMessage['fromUserId'] = (int)$arFields['FROM_USER_ID'];
$arPullMessage['toUserId'] = (int)$arFields['TO_USER_ID'];
$arPullMessage['senderId'] = (int)$arFields['FROM_USER_ID'];
$arPullMessage['chatId'] = (int)$arFields['CHAT_ID'];
}
else
{
$arPullMessage['chatId'] = (int)$arFields['CHAT_ID'];
$arPullMessage['senderId'] = (int)$arFields['AUTHOR_ID'];
foreach ($relations as $relation)
{
if ($message['CHAT_ENTITY_TYPE'] == 'LINES')
{
if ($relation["EXTERNAL_AUTH_ID"] == 'imconnector')
{
unset($relations[$relation["USER_ID"]]);
continue;
}
}
if ($relation["EXTERNAL_AUTH_ID"] == BitrixImBot::EXTERNAL_AUTH_ID)
{
$arBotInChat[$relation["USER_ID"]] = $relation["USER_ID"];
unset($relations[$relation["USER_ID"]]);
continue;
}
}
}
if ($message['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE)
{
$arFields['BOT_IN_CHAT'] = $arBotInChat;
}
BitrixImBot::onMessageDelete(intval($id), $arFields);
if ($completeDelete)
{
BitrixImModelChatTable::update($message['CHAT_ID'], Array(
'MESSAGE_COUNT' => new BitrixMainDBSqlExpression('?# - 1', 'MESSAGE_COUNT'),
));
if ($message['CHAT_PARENT_MID'])
{
$chatData = BitrixImModelChatTable::getById($message['CHAT_ID'])->fetch();
CIMMessageParam::set($chatData['PARENT_MID'], Array(
'CHAT_MESSAGE' => $chatData['MESSAGE_COUNT'],
'CHAT_LAST_DATE' => new BitrixMainTypeDateTime()
));
CIMMessageParam::SendPull($chatData['PARENT_MID'], Array('CHAT_MESSAGE', 'CHAT_LAST_DATE'));
}
$messageObject = new BitrixImV2Message((int)$id);
(new BitrixImV2LinkFavoriteFavoriteService())->unmarkMessageAsFavoriteForAll($messageObject);
(new BitrixImV2MessageReadService())->deleteByMessageId(
$id,
BitrixImV2Chat::getInstance((int)$message['CHAT_ID'])->getRelations()->getUserIds()
);
$completeDelete = true;
CIMMessageParam::DeleteAll($message['ID']);
BitrixImModelMessageTable::delete($message['ID']);
/*$relationCounters = BitrixImChat::getRelation($message['CHAT_ID'], Array(
'SELECT' => Array('ID', 'USER_ID'),
'REAL_COUNTERS' => 'Y',
'USER_DATA' => 'Y',
'SKIP_RELATION_WITH_UNMODIFIED_COUNTERS' => 'Y'
));
foreach ($relationCounters as $relation)
{
if (
$relation['USER_DATA']["EXTERNAL_AUTH_ID"] == BitrixImBot::EXTERNAL_AUTH_ID
|| $relation['USER_DATA']['ACTIVE'] == 'N'
)
{
continue;
}
//BitrixImModelRelationTable::update($relation['ID'], Array('COUNTER' => $relation['COUNTER']));
BitrixImCounter::clearCache($relation['USER_ID']);
}*/
$result = BitrixImModelRecentTable::getList(Array('filter' => Array('=ITEM_MID' => $message['ID'])))->fetchAll();
if (!empty($result))
{
$message = BitrixImModelMessageTable::getList([
'filter' => ['=CHAT_ID' => $message['CHAT_ID']],
'limit' => 1,
'order' => [
'DATE_CREATE' => 'DESC',
'ID' => 'DESC'
]
])->fetch();
if ($message)
{
foreach ($result as $recent)
{
BitrixImModelRecentTable::update(Array(
'USER_ID' => $recent['USER_ID'],
'ITEM_TYPE' => $recent['ITEM_TYPE'],
'ITEM_ID' => $recent['ITEM_ID'],
), Array('ITEM_MID' => $message['ID']));
if ($recent['ITEM_TYPE'] == IM_MESSAGE_PRIVATE)
CIMMessenger::SpeedFileDelete($recent['USER_ID'], IM_SPEED_GROUP);
else
CIMMessenger::SpeedFileDelete($recent['USER_ID'], IM_SPEED_MESSAGE);
}
}
}
}
if ($message['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE)
{
$arPullMessage['dialogId'] = (int)$arFields['FROM_USER_ID'];
$arPullMessage['chatId'] = (int)$message['CHAT_ID'];
$arPullMessage['fromUserId'] = (int)$arFields['FROM_USER_ID'];
$arPullMessage['toUserId'] = (int)$arFields['TO_USER_ID'];
BitrixPullEvent::add($arPullMessage['toUserId'], Array(
'module_id' => 'im',
'command' => ($completeDelete? 'messageDeleteComplete': 'messageDelete'),
'params' => $arPullMessage,
'push' => $completeDelete? Array('badge' => 'Y'): Array(),
'extra' => BitrixImCommon::getPullExtra()
));
$arPullMessage['dialogId'] = (int)$arFields['TO_USER_ID'];
$arPullMessage['fromUserId'] = (int)$arFields['TO_USER_ID'];
$arPullMessage['toUserId'] = (int)$arFields['FROM_USER_ID'];
BitrixPullEvent::add($arPullMessage['toUserId'], Array(
'module_id' => 'im',
'command' => ($completeDelete? 'messageDeleteComplete': 'messageDelete'),
'params' => $arPullMessage,
'push' => $completeDelete? Array('badge' => 'Y'): Array(),
'extra' => BitrixImCommon::getPullExtra()
));
}
else
{
$arPullMessage['dialogId'] = 'chat'.$arPullMessage['chatId'];
$arPullMessage['chatId'] = (int)$message['CHAT_ID'];
BitrixPullEvent::add(array_keys($relations), Array(
'module_id' => 'im',
'command' => ($completeDelete? 'messageDeleteComplete': 'messageDelete'),
'params' => $arPullMessage,
'push' => $completeDelete? Array('badge' => 'Y'): Array(),
'extra' => BitrixImCommon::getPullExtra()
));
}
if ($message['MESSAGE_TYPE'] == IM_MESSAGE_OPEN || $message['MESSAGE_TYPE'] == IM_MESSAGE_OPEN_LINE)
{
CPullWatch::AddToStack('IM_PUBLIC_'.$message['CHAT_ID'], Array(
'module_id' => 'im',
'command' => ($completeDelete? 'messageDeleteComplete': 'messageDelete'),
'params' => $arPullMessage,
'push' => $completeDelete? Array('badge' => 'Y'): Array(),
'extra' => BitrixImCommon::getPullExtra()
));
}
$indexEnabled = BitrixMainConfigOption::get('im', 'message_history_index');
if ($indexEnabled)
{
BitrixImModelMessageIndexTable::delete($id);
}
$messageObject = new BitrixImV2Message(
[
'ID' => (int)$id,
'CHAT_ID' => (int)$message['CHAT_ID'],
'AUTHOR_ID' => (int)$arFields['AUTHOR_ID']
]
);
(new BitrixImV2LinkUrlUrlService())->deleteUrlsByMessage($messageObject);
(new BitrixImV2LinkPinPinService())->unpinMessage($messageObject);
foreach(GetModuleEvents("im", "OnAfterMessagesDelete", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array(intval($id), $arFields, $deleteFlags));
return true;
}