Your IP : 3.149.243.136


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/modules/imopenlines/lib/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/modules/imopenlines/lib/mail.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage crm
 * @copyright 2001-2016 Bitrix
 */
namespace Bitrix\ImOpenLines;

use Bitrix\Main\Localization\Loc;

class Mail
{
	public static function addSessionToMailQueue($sessionId, $withCheck = true)
	{
		if ($withCheck)
		{
			$orm = Model\SessionCheckTable::getList(Array(
				'select' => Array('SESSION_ID', 'SOURCE'),
				'filter' => Array('=SESSION_ID' => $sessionId)
			));
			$session = $orm->fetch();

			if (!$session || $session['SOURCE'] != 'livechat' || $session['SPAM'] == 'Y')
			{
				return false;
			}
		}

		$mailData = new \Bitrix\Main\Type\DateTime();
		$mailData->add('1 MINUTE');

		\Bitrix\ImOpenlines\Model\SessionCheckTable::update($sessionId, Array(
			'DATE_MAIL' => $mailData
		));

		$event = new \Bitrix\Main\Event("imopenlines", "OnSessionToMailQueueAdd", Array('SESSION_ID' => $sessionId));
		$event->send();

		return true;
	}

	public static function removeSessionFromMailQueue($sessionId, $withCheck = true)
	{
		if ($withCheck)
		{
			$orm = Model\SessionCheckTable::getList(Array(
				'select' => Array('SESSION_ID'),
				'filter' => Array('=SESSION_ID' => $sessionId)
			));
			if (!$orm->fetch())
			{
				return false;
			}
		}

		\Bitrix\ImOpenlines\Model\SessionCheckTable::update($sessionId, Array(
			'DATE_MAIL' => null
		));

		return true;
	}

	public static function sendOperatorAnswerAgent($sessionId)
	{
		self::sendOperatorAnswer($sessionId);

		return "";
	}

	public static function sendOperatorAnswer($sessionId)
	{
		$sessionId = intval($sessionId);
		if ($sessionId <= 0 || !\Bitrix\Main\Loader::includeModule('im'))
		{
			return false;
		}

		$select =  Model\SessionTable::getSelectFieldsPerformance();
		$select['CONFIG_LINE_NAME'] = 'CONFIG.LINE_NAME';
		$select['CONFIG_LANGUAGE_ID'] = 'CONFIG.LANGUAGE_ID';
		$select['LIVECHAT_URL_CODE'] = 'LIVECHAT.URL_CODE';
		$select['LIVECHAT_URL_CODE_PUBLIC'] = 'LIVECHAT.URL_CODE_PUBLIC';

		$orm = Model\SessionTable::getList(Array(
			'select' => $select,
			'filter' => Array('=ID' => $sessionId)
		));
		if ($session = $orm->fetch())
		{
			\Bitrix\ImOpenlines\Model\SessionCheckTable::update($session['ID'], Array(
				'DATE_MAIL' => null
			));
		}

		if (!$session || $session['SOURCE'] != 'livechat' || $session['SPAM'] == 'Y')
		{
			return false;
		}

		$email = \Bitrix\Im\User::getInstance($session['USER_ID'])->getEmail();
		if (!$email)
		{
			return false;
		}

		$messages = self::prepareOperatorAnswerForTemplate($session['ID'], false);
		if ($messages <= 0)
		{
			return false;
		}

		$mess = Loc::loadLanguageFile(__FILE__, $session['CONFIG_LANGUAGE_ID']? $session['CONFIG_LANGUAGE_ID']: null);

		$lineName = $session['CONFIG_LINE_NAME'];
		$widgetUrl = $session['EXTRA_URL'];
		if (empty($widgetUrl))
		{
			if (!empty($session['LIVECHAT_URL_CODE_PUBLIC']))
			{
				$widgetUrl = \Bitrix\ImOpenLines\Common::getServerAddress().'/online/'.$session['LIVECHAT_URL_CODE_PUBLIC'];
			}
			else if (!empty($session['LIVECHAT_URL_CODE']))
			{
				$widgetUrl = \Bitrix\ImOpenLines\Common::getServerAddress().'/online/'.$session['LIVECHAT_URL_CODE'];
			}
		}
		$widgetUrlParsed = parse_url($widgetUrl);

		$title = str_replace(
			Array('#SITE_URL#', '#SESSION_ID#'),
			Array($widgetUrlParsed['host'], $sessionId),
			$mess['IMOL_MAIL_HISTORY_TITLE']
		);
		$actionTitle = $mess['IMOL_MAIL_ANSWER_ACTION_TITLE'];
		$actionDesc = str_replace(
			Array('#SESSION_ID#'),
			Array($sessionId),
			$mess['IMOL_MAIL_HISTORY_ACTION_DESC']
		);

		$arFields = array(
			"EMAIL_TO" => $email,
			"EMAIL_TITLE" => $title,
			"TEMPLATE_SERVER_ADDRESS" => \Bitrix\ImOpenLines\Common::getServerAddress(),
			"TEMPLATE_CONFIG_ID" => $session['CONFIG_ID'],
			"TEMPLATE_SESSION_ID" => $sessionId,
			"TEMPLATE_ACTION_TITLE" => $actionTitle,
			"TEMPLATE_ACTION_DESC" => $actionDesc,
			"TEMPLATE_WIDGET_DOMAIN" => $widgetUrlParsed['host'],
			"TEMPLATE_WIDGET_URL" => $widgetUrl,
			"TEMPLATE_LINE_NAME" => $lineName,
		);

		$event = new \CEvent;
		$event->Send("IMOL_OPERATOR_ANSWER", SITE_ID, $arFields, "N", "", array(), $session['CONFIG_LANGUAGE_ID']);

		return true;
	}

	public static function prepareOperatorAnswerForTemplate($sessionId, $setSendFlag = true)
	{
		if (!\Bitrix\Main\Loader::includeModule('im'))
		{
			return false;
		}

		$sessionId = intval($sessionId);
		if (!$sessionId)
			return false;

		$select =  Model\SessionTable::getSelectFieldsPerformance();
		$select['CONFIG_LANGUAGE_ID'] = 'CONFIG.LANGUAGE_ID';

		$orm = Model\SessionTable::getList(Array(
			'select' => $select,
			'filter' => Array('=ID' => $sessionId)
		));
		$session = $orm->fetch();
		if (!$session || $session['SOURCE'] != 'livechat')
		{
			return false;
		}
		$parsedUserCode = Session\Common::parseUserCode($session['USER_CODE']);
		$chatId = $parsedUserCode['EXTERNAL_CHAT_ID'];

		$relation = \Bitrix\Im\Model\RelationTable::getList(Array(
			'filter' => Array(
				'=CHAT_ID' => $chatId,
				'=USER_ID' => $session['USER_ID']
			)
		))->fetch();
		if (!$relation)
		{
			return false;
		}

		$CIMChat = new \CIMChat($session['USER_ID']);
		$result = $CIMChat->GetLastMessageLimit($chatId, $session['START_ID'], $session['END_ID'], false, false);
		if (!$result)
		{
			return false;
		}

		$messages = Array();
		$findClientMessage = false;
		$findOperatorMessage = false;
		$lastMessageId = null;
		foreach ($result['message'] as $messageId => $messageData)
		{
			if (!$lastMessageId)
			{
				$lastMessageId = $messageId;
			}
			if (count($messages) == 0 && $messageId == $relation['LAST_SEND_ID'])
			{
				break;
			}
			if ($messageId < $relation['LAST_SEND_ID'])
			{
				if ($findClientMessage && $messageData['senderId'] != $session['USER_ID'])
				{
					if ($findClientMessage)
					{
						break;
					}
				}
			}
			if ($messageData['senderId'] == $session['USER_ID'])
			{
				$findClientMessage = true;
			}
			else
			{
				$findOperatorMessage = true;
			}
			$messages[$messageId] = $messageData;
		}

		if (!$findOperatorMessage)
			return false;

		\Bitrix\Main\Type\Collection::sortByColumn($messages, Array('id' => SORT_ASC), '', null, true);
		$result['message'] = $messages;

		$messages = self::prepareMessagesForTemplate($session, $result, $session['CONFIG_LANGUAGE_ID']);

		if ($setSendFlag)
		{
			\CIMMessage::SetLastSendId($chatId, $session['USER_ID'], $lastMessageId);
		}

		return $messages;
	}

	public static function sendSessionHistory($sessionId, $email)
	{
		$sessionId = intval($sessionId);
		if ($sessionId <= 0 || $email == '')
		{
			return false;
		}

		$select = Model\SessionTable::getSelectFieldsPerformance();
		$select['CONFIG_LINE_NAME'] = 'CONFIG.LINE_NAME';
		$select['CONFIG_LANGUAGE_ID'] = 'CONFIG.LANGUAGE_ID';
		$select['LIVECHAT_URL_CODE'] = 'LIVECHAT.URL_CODE';
		$select['LIVECHAT_URL_CODE_PUBLIC'] = 'LIVECHAT.URL_CODE_PUBLIC';

		$orm = Model\SessionTable::getList(Array(
			'select' => $select,
			'filter' => Array('=ID' => $sessionId)
		));
		$session = $orm->fetch();
		if (!$session)
		{
			return false;
		}

		$mess = Loc::loadLanguageFile(__FILE__, $session['CONFIG_LANGUAGE_ID']? $session['CONFIG_LANGUAGE_ID']: null);

		Log::write(Array(
			'LANG' => $select['CONFIG_LANGUAGE_ID']? $select['CONFIG_LANGUAGE_ID']: null,
			'MESS' => $mess
		));

		$lineName = $session['CONFIG_LINE_NAME'];
		$widgetUrl = $session['EXTRA_URL'];
		if (empty($widgetUrl))
		{
			if (!empty($session['LIVECHAT_URL_CODE_PUBLIC']))
			{
				$widgetUrl = \Bitrix\ImOpenLines\Common::getServerAddress().'/online/'.$session['LIVECHAT_URL_CODE_PUBLIC'];
			}
			else if (!empty($session['LIVECHAT_URL_CODE']))
			{
				$widgetUrl = \Bitrix\ImOpenLines\Common::getServerAddress().'/online/'.$session['LIVECHAT_URL_CODE'];
			}
		}
		$widgetUrlParsed = parse_url($widgetUrl);

		$title = str_replace(
			Array('#SITE_URL#', '#SESSION_ID#'),
			Array($widgetUrlParsed['host'], $sessionId),
			$mess['IMOL_MAIL_HISTORY_TITLE']
		);
		$actionTitle = $mess['IMOL_MAIL_HISTORY_ACTION_TITLE'];
		$actionDesc = str_replace(
			Array('#SESSION_ID#'),
			Array($sessionId),
			$mess['IMOL_MAIL_HISTORY_ACTION_DESC']
		);

		$arFields = array(
			"EMAIL_TO" => $email,
			"EMAIL_TITLE" => $title,
			"TEMPLATE_SERVER_ADDRESS" => \Bitrix\ImOpenLines\Common::getServerAddress(),
			"TEMPLATE_SESSION_ID" => $sessionId,
			"TEMPLATE_ACTION_TITLE" => $actionTitle,
			"TEMPLATE_ACTION_DESC" => $actionDesc,
			"TEMPLATE_WIDGET_DOMAIN" => $widgetUrlParsed['host'],
			"TEMPLATE_WIDGET_URL" => $widgetUrl,
			"TEMPLATE_LINE_NAME" => $lineName,
		);

		$event = new \CEvent;
		$event->Send("IMOL_HISTORY_LOG", SITE_ID, $arFields, "N", "", Array(), $session['CONFIG_LANGUAGE_ID']);

		\CEvent::ExecuteEvents();

		Model\SessionTable::update($session['ID'], Array('SEND_HISTORY' => 'Y'));

		return true;
	}

	public static function prepareSessionHistoryForTemplate($sessionId)
	{
		if (!\Bitrix\Main\Loader::includeModule('im'))
			return false;

		$sessionId = intval($sessionId);
		if (!$sessionId)
			return false;

		$select =  Model\SessionTable::getSelectFieldsPerformance();
		$select['CONFIG_LANGUAGE_ID'] = 'CONFIG.LANGUAGE_ID';

		$orm = Model\SessionTable::getList(Array(
			'select' => $select,
			'filter' => Array('=ID' => $sessionId)
		));
		$session = $orm->fetch();
		if (!$session)
		{
			return false;
		}

		$CIMChat = new \CIMChat($session['USER_ID']);
		$result = $CIMChat->GetLastMessageLimit($session['CHAT_ID'], $session['START_ID'], $session['END_ID'], false, false, 'ASC');
		if (!$result)
			return false;

		$messages = self::prepareMessagesForTemplate($session, $result, $session['CONFIG_LANGUAGE_ID']);

		return $messages;
	}


	private static function prepareMessagesForTemplate($session, $history, $language = null)
	{
		$language = $language? $language: null;
		$mess = Loc::loadLanguageFile(__FILE__, $language);

		$userTzOffset = \Bitrix\Im\User::getInstance($session['USER_ID'])->getTzOffset();

		$messages = Array();
		foreach ($history['message'] as $messageId => $message)
		{
			if (empty($message['params']['CONNECTOR_MID']))
				continue;

			$isYou = $message['senderId'] == $session['USER_ID'];

			if ($message['senderId'] > 0)
			{
				if ($isYou)
				{
					$authorName = $mess['IMOL_MAIL_AUTHOR_YOU'];
				}
				else
				{
					$authorName = \Bitrix\ImOpenLines\Connector::getOperatorName($session['CONFIG_ID'], $message['senderId'], $session['USER_CODE']);
				}

				$authorAvatar = \Bitrix\ImOpenLines\Connector::getOperatorAvatar($session['CONFIG_ID'], $message['senderId'], $session['USER_CODE']);
				if ($authorAvatar)
				{
					$authorAvatar = mb_substr($authorAvatar, 0, 4) != 'http'? \Bitrix\ImOpenLines\Common::getServerAddress().$authorAvatar: $authorAvatar;
				}
				else
				{
					$authorAvatar = '';
				}

				$systemFlag = 'N';
			}
			else
			{
				$authorName = '';
				$authorAvatar = '';
				$systemFlag = 'Y';
			}

			$currentDate = new \Bitrix\Main\Type\DateTime();
			if (is_object($message['date']))
			{
				$date = $message['date'];
			}
			else
			{
				$date = \Bitrix\Main\Type\DateTime::createFromTimestamp($message['date']);
			}

			if ($date->format('Ymd') == $currentDate->format('Ymd'))
			{
				$messageDate = \FormatDate($mess['IMOL_MAIL_TIME_FORMAT'], $message['date']->getTimestamp()+intval($userTzOffset));
			}
			else
			{
				$messageDate = \FormatDate($mess['IMOL_MAIL_DATETIME_FORMAT'], $message['date']->getTimestamp()+intval($userTzOffset));
			}

			if (isset($message['params']['IMOL_VOTE']))
			{
				if ($message['params']['IMOL_VOTE'] == 'like')
				{
					$messageText = $message['params']['IMOL_VOTE_LIKE'];
				}
				else if ($message['params']['IMOL_VOTE'] == 'dislike')
				{
					$messageText = $message['params']['IMOL_VOTE_DISLIKE'];
				}
				else
				{
					$messageText = $message['params']['IMOL_VOTE_TEXT'];
				}
			}
			else
			{
				$messageText = $message['text'];

				if (isset($message['params']['FILE_ID']))
				{
					$messageText .= ' ['.$mess['IMOL_MAIL_FILE'].']';

					$messageText = trim($messageText);
				}
			}

			$messages[$messageId] = Array(
				'NAME' => $authorName,
				'AVATAR' => $authorAvatar,
				'DATE' => $messageDate,
				'TEXT' => $messageText,
				'CLIENT' => $isYou? 'Y': 'N',
				'SYSTEM' => $systemFlag,
			);
		}

		return $messages;
	}

	public static function installEventsAgent()
	{
		$orm = \Bitrix\Main\Mail\Internal\EventTypeTable::getList(array(
			'select' => array('ID'),
			'filter' => Array(
				'=EVENT_NAME' => Array('IMOL_HISTORY_LOG', 'IMOL_OPERATOR_ANSWER')
			)
		));

		if(!$orm->fetch())
		{
			include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/imopenlines/install/events/set_events.php");
		}

		return "";
	}
}