static function End($arParams)
{
$arConfig['CHAT_ID'] = intval($arParams['CHAT_ID']);
if ($arConfig['CHAT_ID'] <= 0)
return false;
global $DB, $USER;
$arConfig['USER_ID'] = intval($arParams['USER_ID']) > 0? intval($arParams['USER_ID']): intval($USER->GetID());
$arConfig['RECIPIENT_ID'] = intval($arParams['RECIPIENT_ID']);
$arChat = CIMChat::GetChatData(Array('ID' => $arConfig['CHAT_ID'], 'USER_ID' => $USER->GetId()));
if (empty($arChat['chat']))
return false;
$arUserToConnect = Array();
$acceptUserExists = false;
foreach ($arChat['userCallStatus'][$arConfig['CHAT_ID']] as $userId => $callStatus)
{
if ($userId != $arConfig['USER_ID'] && in_array($callStatus, Array(IM_CALL_STATUS_WAIT, IM_CALL_STATUS_ANSWER)))
{
if ($callStatus == IM_CALL_STATUS_ANSWER)
$acceptUserExists = true;
$arUserToConnect[] = $userId;
}
}
if (!$acceptUserExists || empty($arUserToConnect) || count($arUserToConnect) == 1)
{
$arConfig['CLOSE_CONNECT'] = true;
$strSql = "UPDATE b_im_chat SET CALL_TYPE = ".IM_CALL_NONE." WHERE ID = ".$arConfig['CHAT_ID'];
$DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
$strSql = "UPDATE b_im_relation SET CALL_STATUS = ".IM_CALL_STATUS_NONE." WHERE CHAT_ID = ".$arConfig['CHAT_ID'];
$DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
}
else
{
$arConfig['CLOSE_CONNECT'] = false;
$strSql = "UPDATE b_im_relation SET CALL_STATUS = ".IM_CALL_STATUS_DECLINE." WHERE CHAT_ID = ".$arConfig['CHAT_ID']." AND USER_ID = ".$arConfig['USER_ID'];
$DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__);
}
$arConfig['CALL_TO_GROUP'] = $arChat['chat'][$arConfig['CHAT_ID']]['message_type'] != IM_MESSAGE_PRIVATE;
if ($arParams['REASON'] == 'decline')
{
if ($arConfig['CALL_TO_GROUP'])
{
if ($arParams['ACTIVE'] == 'Y')
{
self::MessageToChat($arConfig['CHAT_ID'], $arConfig['CLOSE_CONNECT']? "IM_CALL_CHAT_CLOSE_": "IM_CALL_CHAT_END_", $arConfig['USER_ID'], true);
}
else
{
self::MessageToChat($arConfig['CHAT_ID'], $arConfig['CLOSE_CONNECT']? "IM_CALL_CHAT_CLOSE_": "IM_CALL_CHAT_G_DECLINE_", $arConfig['USER_ID'], true);
}
}
else
{
if ($arParams['ACTIVE'] == 'Y')
{
self::MessageToPrivate($arConfig['USER_ID'], $arConfig['RECIPIENT_ID'], "IM_CALL_CHAT_END");
}
else
{
self::MessageToPrivate($arConfig['USER_ID'], $arConfig['RECIPIENT_ID'], "IM_CALL_CHAT_DECLINE_", true);
}
}
}
else if ($arParams['REASON'] == 'busy')
{
if ($arConfig['CALL_TO_GROUP'])
{
self::MessageToChat($arConfig['CHAT_ID'], "IM_CALL_CHAT_G_BUSY_", $arConfig['USER_ID'], true);
}
else
{
self::MessageToPrivate($arConfig['USER_ID'], $arConfig['RECIPIENT_ID'], "IM_CALL_CHAT_BUSY_", true);
}
}
else if ($arParams['REASON'] == 'waitTimeout')
{
if ($arConfig['CALL_TO_GROUP'])
{
self::MessageToChat($arConfig['CHAT_ID'], "IM_CALL_CHAT_TIMEOUT");
}
else
{
self::MessageToPrivate($arConfig['USER_ID'], $arConfig['RECIPIENT_ID'], "IM_CALL_CHAT_WAIT", $arConfig['RECIPIENT_ID'], false);
}
}
else if ($arParams['REASON'] == 'errorOffline')
{
if ($arConfig['CALL_TO_GROUP'])
{
self::MessageToChat($arConfig['CHAT_ID'], "IM_CALL_CHAT_TIMEOUT");
}
else
{
self::MessageToPrivate($arConfig['RECIPIENT_ID'], $arConfig['USER_ID'], "IM_CALL_CHAT_OFFLINE", true, false);
}
}
else if ($arParams['REASON'] == 'errorAccess')
{
if ($arConfig['CALL_TO_GROUP'])
{
self::MessageToChat($arConfig['CHAT_ID'], "IM_CALL_CHAT_ERROR_", $arConfig['USER_ID'], true);
}
else
{
self::MessageToPrivate($arConfig['USER_ID'], $arConfig['RECIPIENT_ID'], "IM_CALL_CHAT_ERROR", true, false);
}
}
$arSend = Array();
$arSend['callToGroup'] = $arConfig['CALL_TO_GROUP'];
$arSend['closeConnect'] = $arConfig['CLOSE_CONNECT'];
if (isset($arParams['VIDEO']))
$arSend['video'] = $arParams['VIDEO'] == 'Y'? true: false;
foreach ($arUserToConnect as $userId)
{
self::Command($arConfig['CHAT_ID'], $userId, $arParams['REASON'], $arSend);
}
if ($arParams['REASON'] == 'decline')
{
self::Command($arConfig['CHAT_ID'], $arConfig['USER_ID'], 'decline_self', $arSend);
self::Command($arConfig['CHAT_ID'], $arConfig['RECIPIENT_ID'], 'end_call', $arSend);
}
if (!$arConfig['CALL_TO_GROUP'] && CModule::IncludeModule('pull') && CPullOptions::GetPushStatus())
{
BitrixPullPush::add($arConfig['USER_ID'], Array(
'module_id' => 'im',
'push' => Array(
'expiry' => 0,
'advanced_params' => Array(
'notificationsToCancel' => array('IM_CALL_'. $arConfig['RECIPIENT_ID']),
),
'send_immediately' => 'Y'
)
));
BitrixPullPush::add($arConfig['RECIPIENT_ID'], Array(
'module_id' => 'im',
'push' => Array(
'expiry' => 0,
'advanced_params' => Array(
'notificationsToCancel' => array('IM_CALL_'. $arConfig['USER_ID']),
),
'send_immediately' => 'Y'
)
));
}
return true;
}