public function Add($arParams)
{
$type = '';
if (isset($arParams['MESSAGE_TYPE']))
{
$type = $arParams['MESSAGE_TYPE'];
}
elseif (isset($arParams['TYPE']))
{
$type = $arParams['MESSAGE_TYPE'] = $arParams['TYPE'];
}
$arParams['USER_ID'] = $this->user_id;
$authorId = $arParams['USER_ID'];
if (isset($arParams['AUTHOR_ID']))
{
$authorId = intval($arParams['AUTHOR_ID']);
}
if (isset($arParams['OWNER_ID']))
{
$authorId = intval($arParams['OWNER_ID']);
}
if ($authorId)
{
$arParams['AUTHOR_ID'] = $authorId;
}
if (isset($arParams['AVATAR_ID']))
{
$arParams['AVATAR'] = (int) $arParams['AVATAR_ID'];
}
$chatResult = IMV2ChatChatFactory::getInstance()->addChat($arParams);
if (!$chatResult->isSuccess() || !$chatResult->hasResult())
{
return false;
}
if (isset($arParams['MESSAGE']))
{
$message = trim($arParams['MESSAGE']);
}
if (isset($message) && $message)
{
if ($type === IMV2Chat::IM_TYPE_PRIVATE)
{
CIMMessage::Add([
"FROM_USER_ID" => $this->user_id,
"TO_USER_ID" => $this->user_id,
"MESSAGE" => $message,
]);
}
else
{
self::AddMessage([
"TO_CHAT_ID" => $chatResult->getResult()['CHAT_ID'],
"FROM_USER_ID" => $this->user_id,
"SYSTEM" => $this->user_id ? 'N' : 'Y',
"MESSAGE" => $message,
]);
}
}
$chat = $chatResult->getResult()['CHAT'];
CIMContactList::CleanAllChatCache();
return $chat->getChatId();
/**
global $DB;
$chatTitle = '';
if (isset($arParams['TITLE']))
$chatTitle = trim($arParams['TITLE']);
$chatDescription = '';
if (isset($arParams['DESCRIPTION']))
$chatDescription = trim($arParams['DESCRIPTION']);
$userId = Array();
if (isset($arParams['USERS']))
$userId = $arParams['USERS'];
$callNumber = '';
if (isset($arParams['CALL_NUMBER']))
$callNumber = $arParams['CALL_NUMBER'];
$avatarId = 0;
if (isset($arParams['AVATAR_ID']))
$avatarId = intval($arParams['AVATAR_ID']);
$authorId = $this->user_id;
if (isset($arParams['AUTHOR_ID']))
$authorId = intval($arParams['AUTHOR_ID']);
if (isset($arParams['OWNER_ID']))
$authorId = intval($arParams['OWNER_ID']);
$parentId = 0;
if (isset($arParams['PARENT_ID']))
$parentId = intval($arParams['PARENT_ID']);
$parentMid = 0;
if (isset($arParams['PARENT_MID']))
$parentMid = intval($arParams['PARENT_MID']);
$pinMessageId = 0;
if (isset($arParams['PIN_MESSAGE_ID']))
$pinMessageId = intval($arParams['PIN_MESSAGE_ID']);
$managers = array();
if (isset($arParams['MANAGERS']))
$managers = $arParams['MANAGERS'];
$entityType = '';
if (isset($arParams['ENTITY_TYPE']))
$entityType = $arParams['ENTITY_TYPE'];
$entityId = '';
if (isset($arParams['ENTITY_ID']))
$entityId = $arParams['ENTITY_ID'];
$entityData1 = '';
if (isset($arParams['ENTITY_DATA_1']))
$entityData1 = $arParams['ENTITY_DATA_1'];
$entityData2 = '';
if (isset($arParams['ENTITY_DATA_2']))
$entityData2 = $arParams['ENTITY_DATA_2'];
$entityData3 = '';
if (isset($arParams['ENTITY_DATA_3']))
$entityData3 = $arParams['ENTITY_DATA_3'];
$message = '';
if (isset($arParams['MESSAGE']))
$message = trim($arParams['MESSAGE']);
$color = '';
if (isset($arParams['COLOR']) && IMColor::isSafeColor($arParams['COLOR']))
$color = $arParams['COLOR'];
$skipAddMessage = isset($arParams['SKIP_ADD_MESSAGE']) && $arParams['SKIP_ADD_MESSAGE'] === 'Y';
$type = IM_MESSAGE_CHAT;
if (isset($arParams['TYPE']) && in_array($arParams['TYPE'], Array(IM_MESSAGE_OPEN, IM_MESSAGE_CHAT, IM_MESSAGE_PRIVATE, IM_MESSAGE_OPEN_LINE)))
{
if (!CIMMessenger::CheckEnableOpenChat() && $arParams['TYPE'] == IM_MESSAGE_OPEN)
{
$type = IM_MESSAGE_CHAT;
}
else if ($this->user_id == 0 || !IMUser::getInstance($this->user_id)->isExtranet())
{
$type = $arParams['TYPE'];
}
}
$skipUserAdd = false;
if ($userId === false)
{
$skipUserAdd = true;
}
$arUserId = Array();
if ($this->user_id > 0)
{
$arUserId[$this->user_id] = $this->user_id;
}
if (is_array($userId))
{
$arUserId += CIMContactList::PrepareUserIds($userId);
}
else if (intval($userId) > 0)
{
$arUserId[intval($userId)] = intval($userId);
}
if (!$skipUserAdd)
{
if (count($arUserId) < 1)
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_MIN_USER"), "MIN_USER");
return false;
}
if (false && count($arUserId) > 500)
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_MAX_USER", Array('#COUNT#' => 500)), "MAX_USER");
return false;
}
if (
$entityType != 'PERSONAL'
&& !IsModuleInstalled('intranet')
&& CModule::IncludeModule('socialnetwork')
&& CSocNetUser::IsFriendsAllowed()
)
{
$arFriendUsers = Array();
$dbFriends = CSocNetUserRelations::GetList(array(),array("USER_ID" => $this->user_id, "RELATION" => SONET_RELATIONS_FRIEND), false, false, array("ID", "FIRST_USER_ID", "SECOND_USER_ID", "DATE_CREATE", "DATE_UPDATE", "INITIATED_BY"));
while ($arFriends = $dbFriends->Fetch())
{
$friendId = $this->user_id == $arFriends["FIRST_USER_ID"]? $arFriends["SECOND_USER_ID"]: $arFriends["FIRST_USER_ID"];
$arFriendUsers[$friendId] = $friendId;
}
foreach ($arUserId as $id => $userId)
{
if ($userId == $this->user_id)
continue;
if (!isset($arFriendUsers[$userId]) && CIMSettings::GetPrivacy(CIMSettings::PRIVACY_CHAT, $userId) == CIMSettings::PRIVACY_RESULT_CONTACT)
unset($arUserId[$id]);
}
if (count($arUserId) <= 1)
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_MIN_USER_BY_PRIVACY"), "MIN_USER_BY_PRIVACY");
return false;
}
}
}
$arUsers = CIMContactList::GetUserData(array(
'ID' => array_values($arUserId),
'DEPARTMENT' => 'N',
'USE_CACHE' => 'N'
));
$arUsers = is_array($arUsers['users'])? $arUsers['users']: Array();
$arUsersName = Array();
if ($chatDescription == '' && $type == IM_MESSAGE_OPEN)
{
$chatDescription = $message;
}
$chatColorCode = "";
if ($entityType === 'VIDEOCONF')
{
CGlobalCounter::Increment('im_videoconf_count', CGlobalCounter::ALL_SITES, false);
$videoconfCount = CGlobalCounter::GetValue('im_videoconf_count', CGlobalCounter::ALL_SITES);
if ($videoconfCount === 999)
{
CGlobalCounter::Set('im_videoconf_count', 1, CGlobalCounter::ALL_SITES, '', false);
}
}
else if (IMColor::isEnabled())
{
if ($color)
{
$chatColorCode = $color;
}
else
{
CGlobalCounter::Increment('im_chat_color_id', CGlobalCounter::ALL_SITES, false);
$chatColorId = CGlobalCounter::GetValue('im_chat_color_id', CGlobalCounter::ALL_SITES);
$chatColorCode = BitrixImColor::getCodeByNumber($chatColorId);
CGlobalCounter::Increment('im_chat_color_'.$chatColorCode, CGlobalCounter::ALL_SITES, false);
}
$chatColorCodeCount = CGlobalCounter::GetValue('im_chat_color_'.$chatColorCode, CGlobalCounter::ALL_SITES);
if ($chatColorCodeCount == 99)
{
CGlobalCounter::Set('im_chat_color_'.$chatColorCode, 1, CGlobalCounter::ALL_SITES, '', false);
}
}
if ($chatTitle == "")
{
if ($entityType === 'VIDEOCONF')
{
$chatTitle = GetMessage('IM_VIDEOCONF_NAME_FORMAT_NEW', [
'#NUMBER#' => $videoconfCount
]);
}
else if (IMColor::isEnabled())
{
$chatTitle = GetMessage('IM_CHAT_NAME_FORMAT', Array(
'#COLOR#' => BitrixImColor::getName($chatColorCode),
'#NUMBER#' => $chatColorCodeCount+1,
));
}
else
{
foreach ($arUserId as $userId)
{
$arUsersName[$userId] = htmlspecialcharsback($arUsers[$userId]['name']);
}
$chatTitle = implode(', ', $arUsersName);
}
}
$isExtranet = false;
if (!in_array($entityType, Array('LINES', 'LIVECHAT')))
{
foreach ($arUsers as $userData)
{
if ($userData['extranet'])
{
$isExtranet = true;
break;
}
}
}
$result = IMModelChatTable::add(Array(
"PARENT_ID" => $parentId,
"PARENT_MID" => $parentMid,
"PIN_MESSAGE_ID" => $pinMessageId,
"TITLE" => mb_substr($chatTitle, 0, 255),
"DESCRIPTION" => $chatDescription,
"TYPE" => $type,
"COLOR" => $chatColorCode,
"AVATAR" => $avatarId,
"AUTHOR_ID" => $authorId,
"ENTITY_TYPE" => $entityType,
"ENTITY_ID" => $entityId,
"ENTITY_DATA_1" => $entityData1,
"ENTITY_DATA_2" => $entityData2,
"ENTITY_DATA_3" => $entityData3,
"EXTRANET" => $isExtranet? 'Y': 'N',
"CALL_NUMBER" => $callNumber,
"USER_COUNT" => count($arUsers)
));
$publicLink = '';
$chatId = $result->getId();
if (!$result->isSuccess())
{
$errors = $result->getErrors();
if (!empty($errors))
{
$firstError = $errors[0];
$GLOBALS["APPLICATION"]->ThrowException($firstError->getMessage(), $firstError->getCode());
}
return false;
}
if ($chatId > 0)
{
$params = $result->getData();
if (intval($params['AVATAR']) > 0)
$this->lastAvatarId = $params['AVATAR'];
$arUsersName = Array();
foreach ($arUserId as $userId)
{
if ($userId != $this->user_id)
$arUsersName[$userId] = htmlspecialcharsback($arUsers[$userId]['name']);
ImModelRelationTable::add(array(
"CHAT_ID" => $chatId,
"MESSAGE_TYPE" => $params['TYPE'],
"USER_ID" => $userId,
//"STATUS" => IM_STATUS_READ,
"MANAGER" => $authorId == $userId || isset($managers[$userId]) ? 'Y' : 'N',
));
if ($params['TYPE'] != IM_MESSAGE_OPEN)
{
CIMContactList::CleanChatCache($userId);
}
}
if ($params['TYPE'] == IM_MESSAGE_OPEN)
{
CIMContactList::CleanAllChatCache();
}
$generalChatId = self::GetGeneralChatId();
if (false && $params['TYPE'] == IM_MESSAGE_OPEN && $generalChatId > 0) // disabled auto-posting in general chat about new open chan
{
$attach = new CIMMessageParamAttach(null, BitrixImColor::getColor($chatColorCode));
$attach->AddChat(Array(
"NAME" => $params['TITLE'],
"CHAT_ID" => $chatId
));
$attach->AddMessage($params['DESCRIPTION']);
if ($this->user_id > 0 && !$skipAddMessage)
{
$createText = GetMessage("IM_GENERAL_CREATE_BY_USER_NEW", Array('#USER_NAME#' => htmlspecialcharsback($arUsers[$this->user_id]['name'])));
}
else
{
$createText = GetMessage("IM_GENERAL_CREATE_NEW");
}
self::AddMessage(Array(
"TO_CHAT_ID" => $generalChatId,
"FROM_USER_ID" => $this->user_id,
"MESSAGE" => $createText,
"SYSTEM" => 'Y',
"ATTACH" => $attach
));
}
if ($entityType === 'VIDEOCONF')
{
$aliasData = $arParams['VIDEOCONF']['ALIAS_DATA'];
IMModelAliasTable::update($aliasData['ID'], [
'ENTITY_ID' => $chatId
]);
$conferenceData = [
'ALIAS_ID' => $aliasData['ID']
];
if (isset($arParams['VIDEOCONF']['PASSWORD']))
{
$conferenceData['PASSWORD'] = $arParams['VIDEOCONF']['PASSWORD'];
}
if (isset($arParams['VIDEOCONF']['INVITATION']))
{
$conferenceData['INVITATION'] = $arParams['VIDEOCONF']['INVITATION'];
}
$conferenceData['IS_BROADCAST'] = isset($arParams['VIDEOCONF']['IS_BROADCAST']) && $arParams['VIDEOCONF']['IS_BROADCAST'] === 'Y'? 'Y': 'N';
$creationResult = IMModelConferenceTable::add($conferenceData);
if (isset($arParams['VIDEOCONF']['PRESENTERS']))
{
foreach ($arParams['VIDEOCONF']['PRESENTERS'] as $presenter)
{
IMModelConferenceUserRoleTable::add([
'CONFERENCE_ID' => $creationResult->getId(),
'USER_ID' => $presenter,
'ROLE' => ImCallConference::ROLE_PRESENTER
]);
}
}
$attach = new CIMMessageParamAttach(null, BitrixImColor::getColor($chatColorCode));
$attach->AddLink([
"NAME" => $aliasData['LINK'],
"DESC" => GetMessage("IM_VIDEOCONF_SHARE_LINK"),
"LINK" => $aliasData['LINK']
]);
$keyboard = new BitrixImBotKeyboard();
$keyboard->addButton(
[
"TEXT" => GetMessage("IM_VIDEOCONF_COPY_LINK"),
"ACTION" => "COPY",
"ACTION_VALUE" => $aliasData['LINK'],
"DISPLAY" => "LINE",
"BG_COLOR" => "#A4C31E",
"TEXT_COLOR" => "#FFF"
]
);
self::AddMessage([
"TO_CHAT_ID" => $chatId,
"SYSTEM" => 'Y',
"FROM_USER_ID" => $this->user_id,
"MESSAGE" => GetMessage("IM_VIDEOCONF_LINK_TITLE"),
"ATTACH" => $attach,
"KEYBOARD" => $keyboard
]);
}
if ($message)
{
if ($params['TYPE'] == IM_MESSAGE_PRIVATE)
{
if ($params['ENTITY_TYPE'] == 'PERSONAL')
{
CUserOptions::SetOption('im', 'personalChat', $chatId, false, $this->user_id);
}
CIMMessage::Add(Array(
"FROM_USER_ID" => $this->user_id,
"TO_USER_ID" => $this->user_id,
"MESSAGE" => $message,
));
}
else
{
self::AddMessage(Array(
"TO_CHAT_ID" => $chatId,
"FROM_USER_ID" => $this->user_id,
"SYSTEM" => $this->user_id? 'N': 'Y',
"MESSAGE" => $message,
));
}
}
else if ($params['TYPE'] == IM_MESSAGE_OPEN && !$skipUserAdd)
{
if ($this->user_id > 0)
{
$createText = GetMessage("IM_CHAT_CREATE_OPEN_".$arUsers[$this->user_id]['gender']."_NEW", Array('#USER_NAME#' => htmlspecialcharsback($arUsers[$this->user_id]['name']), '#CHAT_TITLE#' => $params['TITLE']));
}
else
{
$createText = GetMessage("IM_CHAT_CREATE_OPEN_NEW", Array('#CHAT_TITLE#' => $params['TITLE']));
}
self::AddMessage(Array(
"TO_CHAT_ID" => $chatId,
"FROM_USER_ID" => $this->user_id,
"MESSAGE" => $createText,
"SYSTEM" => 'Y',
));
}
if (isset($arUsers[$this->user_id]) && count($arUsersName) >= 1 && !$skipUserAdd && !$skipAddMessage)
{
self::AddMessage(Array(
"TO_CHAT_ID" => $chatId,
"FROM_USER_ID" => $this->user_id,
"MESSAGE" => GetMessage("IM_CHAT_JOIN_".$arUsers[$this->user_id]['gender'], Array('#USER_1_NAME#' => htmlspecialcharsback($arUsers[$this->user_id]['name']), '#USER_2_NAME#' => implode(', ', $arUsersName))),
"SYSTEM" => 'Y',
));
}
foreach ($arUserId as $userId)
{
if (IMUser::getInstance($userId)->isBot())
{
IMBot::changeChatMembers($chatId, $userId);
IMBot::onJoinChat('chat'.$chatId, Array(
'CHAT_TYPE' => $type,
'MESSAGE_TYPE' => $type,
'BOT_ID' => $userId,
'USER_ID' => $this->user_id,
"CHAT_AUTHOR_ID" => $authorId,
"CHAT_ENTITY_TYPE" => $entityType,
"CHAT_ENTITY_ID" => $entityId,
"ACCESS_HISTORY" => true,
));
}
}
self::addChatIndex((int)$chatId, mb_substr($chatTitle, 0, 255));
}
else
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_IM_ERROR_EMPTY_USER_OR_CHAT"), "ERROR_OF_CREATE_CHAT");
return false;
}
return $chatId;
*/
}