Your IP : 3.23.128.245


Current Path : /var/www/axolotl/data/www/murmansk.axolotls.ru/bitrix/modules/imbot/lib/bot/
Upload File :
Current File : /var/www/axolotl/data/www/murmansk.axolotls.ru/bitrix/modules/imbot/lib/bot/support24.php

<?php
namespace Bitrix\ImBot\Bot;

use Bitrix\Main\Config\Option;
use Bitrix\Main\Localization\Loc;

Loc::loadMessages(__FILE__);

class Support24 extends Network
{
	const BOT_CODE = "support24";

	const SUPPORT_LEVEL_NONE = 'none';
	const SUPPORT_LEVEL_FREE = 'free';
	const SUPPORT_LEVEL_PAID = 'paid';
	const SUPPORT_LEVEL_PARTNER = 'partner';

	const SUPPORT_TIME_UNLIMITED = -1;
	const SUPPORT_TIME_NONE = 0;

	const SCHEDULE_ACTION_WELCOME = 'welcome';
	const SCHEDULE_ACTION_INVOLVEMENT = 'involvement';
	const SCHEDULE_ACTION_MESSAGE = 'message';
	const SCHEDULE_ACTION_PARTNER_JOIN = 'partner_join';

	const SCHEDULE_DELETE_ALL = null;

	const INVOLVEMENT_LAST_MESSAGE_BLOCK_TIME = 8; // hour

	const LIST_BOX_SUPPORT_CODES = Array(
		'ru' => '4df232699a9e1d0487c3972f26ea8d25',
		'default' => '1a146ac74c3a729681c45b8f692eab73',
	);

	private static $isAdmin = Array();
	private static $isIntegrator = Array();

	public static function getUserSupportLevel()
	{
		if (Partner24::getBotId() && Partner24::isActiveSupport())
		{
			return self::SUPPORT_LEVEL_PARTNER;
		}
		else if (self::getBotId() > 0)
		{
			return self::getSupportLevel();
		}

		return self::SUPPORT_LEVEL_NONE;
	}

	public static function getSupportLevel()
	{
		if (\Bitrix\Main\Loader::includeModule('bitrix24'))
		{
			if (self::isActivePaidSupport())
			{
				$supportLevel = self::SUPPORT_LEVEL_PAID;
			}
			else
			{
				$supportLevel = self::SUPPORT_LEVEL_FREE;
			}
		}
		else
		{
			$supportLevel = self::SUPPORT_LEVEL_PAID;
		}

		return $supportLevel;
	}

	public static function getLicenceLanguage()
	{
		$lang = 'en';
		if (\Bitrix\Main\Loader::includeModule('bitrix24'))
		{
			$prefix = \CBitrix24::getLicensePrefix();
			if ($prefix)
			{
				$lang = $prefix;
			}
		}
		else
		{
			if (\Bitrix\Main\Localization\CultureTable::getList(array('filter' => array('=CODE' => 'ru')))->fetch())
			{
				$lang = 'ru';
			}
		}

		return $lang;
	}

	public static function getBusinessUsers()
	{
		$users = null;
		$option = \Bitrix\Main\Config\Option::get("bitrix24", "business_tools_unlim_users", false);
		if ($option)
		{
			$users = explode(",", $option);
		}

		return $users;
	}

	public static function getAdministrators()
	{
		$users = array();
		if (\Bitrix\Main\Loader::includeModule('bitrix24'))
		{
			$users = \CBitrix24::getAllAdminId();
		}
		else
		{
			$res = \CAllGroup::GetGroupUserEx(1);
			while($row = $res->fetch())
			{
				$users[] = $row["USER_ID"];
			}
		}

		return $users;
	}

	private static function getBotCode()
	{
		if (\Bitrix\Main\Loader::includeModule('bitrix24'))
		{
			if (self::getSupportLevel() == self::SUPPORT_LEVEL_PAID)
			{
				$code = \Bitrix\Main\Config\Option::get('imbot', "support24_paid_code", "");
			}
			else
			{
				$code = \Bitrix\Main\Config\Option::get('imbot', "support24_free_code", "");
			}
		}
		else
		{
			$lang = self::getLicenceLanguage();

			if (array_key_exists($lang, self::LIST_BOX_SUPPORT_CODES))
			{
				$code = self::LIST_BOX_SUPPORT_CODES[$lang];
			}
			else
			{
				$code = self::LIST_BOX_SUPPORT_CODES['default'];
			}
		}

		return $code;
	}

	public static function register(array $params = Array())
	{
		if (!\Bitrix\Main\Loader::includeModule('im'))
			return false;

		$botId = parent::join(self::getBotCode());
		if (!$botId)
			return false;

		\Bitrix\Main\Config\Option::set('imbot', "support24_bot_id", $botId);
		\Bitrix\Main\Config\Option::set('imbot', "support24_support_level", self::getSupportLevel());

		self::updateBotProperties();

		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->registerEventHandlerCompatible("main", "OnAfterSetOption_~controller_group_name", "imbot", "\Bitrix\ImBot\Bot\Support24", "onAfterLicenseChange");
		$eventManager->registerEventHandlerCompatible("main", "OnAfterUserAuthorize", "imbot", "\Bitrix\ImBot\Bot\Support24", "onAfterUserAuthorize");

		self::scheduleAction(1, self::SCHEDULE_ACTION_WELCOME, '', 10);

		\Bitrix\Im\Command::register(Array(
			'MODULE_ID' => self::MODULE_ID,
			'BOT_ID' => $botId,
			'COMMAND' => 'support24',
			'HIDDEN' => 'Y',
			'CLASS' => __CLASS__,
			'METHOD_COMMAND_ADD' => 'onCommandAdd'
		));

		return $botId;
	}

	public static function unRegister($code = '', $serverRequest = true)
	{
		if (!\Bitrix\Main\Loader::includeModule('im'))
			return false;

		self::sendRequestFinalizeSession();

		$code = self::getBotCode();
		$botId = self::getBotId();

		$result = \Bitrix\Im\Bot::unRegister(Array('BOT_ID' => $botId));
		if (!$result)
		{
			return false;
		}

		self::deleteScheduledAction(self::SCHEDULE_DELETE_ALL);

		\Bitrix\Main\Config\Option::set('imbot', "support24_bot_id", 0);
		\Bitrix\Main\Config\Option::set('imbot', "network_".$code."_bot_id", 0);

		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->unregisterEventHandler("main", "OnAfterSetOption_~controller_group_name", "imbot", "\Bitrix\ImBot\Bot\Support24", "onAfterLicenseChange");
		$eventManager->unregisterEventHandler("main", "OnAfterUserAuthorize", "imbot", "\Bitrix\ImBot\Bot\Support24", "onAfterUserAuthorize");

		if ($serverRequest)
		{
			$result = self::sendUnregisterRequest($code, $botId);
		}

		return $result;
	}

	public static function isEnabled()
	{
		return self::getBotId() > 0;
	}

	public static function getBotId()
	{
		return \Bitrix\Main\Config\Option::get('imbot', "support24_bot_id", 0);
	}

	public static function getBotName()
	{
		$optionName = self::getSupportLevel() == self::SUPPORT_LEVEL_FREE? "support24_free_name": "support24_paid_name";
		return \Bitrix\Main\Config\Option::get('imbot', $optionName, '');
	}

	public static function getBotDesc()
	{
		$optionName = self::getSupportLevel() == self::SUPPORT_LEVEL_FREE? "support24_free_desc": "support24_paid_desc";
		return \Bitrix\Main\Config\Option::get('imbot', $optionName, '');
	}

	public static function getBotAvatar()
	{
		$optionName = self::getSupportLevel() == self::SUPPORT_LEVEL_FREE? "support24_free_avatar": "support24_paid_avatar";
		return \Bitrix\Main\Config\Option::get('imbot', $optionName, '');
	}

	public static function getPartnerId()
	{
		return 0;
	}

	public static function getPartnerName()
	{
		return '';
	}

	public static function getPartnerCode()
	{
		return \Bitrix\Main\Config\Option::get("bitrix24", "partner_ol", "");
	}

	public static function getPartnerData()
	{
		return '';
	}

	public static function getFreeSupportLifeTime()
	{
		return (int)\Bitrix\Main\Config\Option::get('imbot', "support24_free_days", 16);
	}

	public static function isFreeSupportLifeTimeExpired()
	{
		$generationDate = (int)\Bitrix\Main\Config\Option::get('imbot', 'support24_free_start_date', 0);
		if ($generationDate == 0)
		{
			\Bitrix\Main\Config\Option::set('imbot', 'support24_free_start_date', time());
			return true;
		}

		$isActive = time() - $generationDate < 86400 * self::getFreeSupportLifeTime();

		return !$isActive;
	}

	public static function isActiveFreeSupport()
	{
		if (self::getSupportLevel() != self::SUPPORT_LEVEL_FREE)
		{
			return false;
		}

		if (self::getFreeSupportLifeTime() == self::SUPPORT_TIME_UNLIMITED)
		{
			return true;
		}

		return !self::isFreeSupportLifeTimeExpired();
	}

	public static function isActiveFreeSupportForAll()
	{
		return (bool)\Bitrix\Main\Config\Option::get('imbot', 'support24_free_for_all', false);
	}

	public static function isActiveFreeSupportForUser($userId)
	{
		if (!self::getBotId())
			return false;

		if (self::getSupportLevel() != self::SUPPORT_LEVEL_FREE)
			return false;

		if (!\CModule::IncludeModule('bitrix24'))
			return false;

		if (self::isActivePartnerSupport() && !self::isUserIntegrator($userId))
			return false;

		if (self::isActiveFreeSupportForAll())
			return true;

		// temporary remove because free plan is unlimited
		//if (\CBitrix24BusinessTools::isLicenseUnlimited())
		//	return true;

		if (self::isUserAdmin($userId) || self::isUserIntegrator($userId))
			return true;

		// temporary remove because free plan is unlimited
		//$users = \CBitrix24BusinessTools::getUnlimUsers();
		//if (in_array($userId, $users))
		//	return true;

		return false;
	}

	public static function isUserAdmin($userId)
	{
		if (isset(self::$isAdmin[$userId]))
		{
			return self::$isAdmin[$userId];
		}

		global $USER;
		if (\Bitrix\Main\Loader::includeModule('bitrix24'))
		{
			if (is_object($USER) && $USER->GetId() > 0 && $USER->GetId() == $userId && $USER->IsAdmin())
			{
				$result = true;
			}
			else
			{
				$result = \CBitrix24::IsPortalAdmin($userId);
			}
		}
		else
		{
			if (is_object($USER) && $USER->GetId() > 0 && $USER->GetId() == $userId)
			{
				$result = $USER->IsAdmin();
			}
			else
			{
				$result = false;

				$groups = \Bitrix\Main\UserTable::getUserGroupIds($userId);
				foreach ($groups as $groupId)
				{
					if ($groupId == 1)
					{
						$result = true;
						break;
					}
				}
			}
		}

		self::$isAdmin[$userId] = $result;

		return $result;
	}

	public static function isUserIntegrator($userId)
	{
		if (!$userId)
		{
			return false;
		}

		if (isset(self::$isIntegrator[$userId]))
		{
			return self::$isIntegrator[$userId];
		}

		if (\Bitrix\Main\Loader::includeModule('bitrix24'))
		{
			$result = \CBitrix24::isIntegrator($userId);
		}
		else
		{
			$result = false;
		}

		self::$isIntegrator[$userId] = $result;

		return $result;
	}

	public static function isActivePartnerSupport()
	{
		return Partner24::isEnabled() && Partner24::isActiveSupport();
	}

	public static function isActivePaidSupport()
	{
		return (bool)\Bitrix\Main\Config\Option::get('imbot', 'support24_paid_active', false);
	}

	public static function isActivePaidSupportForAll()
	{
		return (bool)\Bitrix\Main\Config\Option::get('imbot', 'support24_paid_for_all', false);
	}

	public static function isActivePaidSupportForUser($userId)
	{
		if (!self::getBotId())
		{
			return false;
		}

		if (self::getSupportLevel() != self::SUPPORT_LEVEL_PAID)
		{
			return false;
		}

		if (self::isActivePartnerSupport() && !self::isUserIntegrator($userId))
		{
			return false;
		}

		if (self::isActivePaidSupportForAll())
		{
			return true;
		}

		if (!$userId)
		{
			return false;
		}

		return self::isUserAdmin($userId) || self::isUserIntegrator($userId);
	}

	public static function isNeedUpdateBotFieldsAfterNewMessage()
	{
		return false;
	}

	public static function onAnswerAdd($command, $params)
	{
		return self::onReceiveCommand($command, $params);
	}

	public static function onReceiveCommand($command, $params)
	{
		if (isset($params['LINE']['CODE']) && $params['LINE']['CODE'] !== self::getBotCode())
		{
			return new \Bitrix\ImBot\Error(__METHOD__, 'SUPPORT_CODE_MISMATCH', 'Support code is not correct for this portal');
		}

		return parent::onReceiveCommand($command, $params);
	}

	public static function isNeedUpdateBotAvatarAfterNewMessage()
	{
		return (bool)self::getBotAvatar() !== true;
	}

	public static function onWelcomeMessage($dialogId, $joinFields)
	{
		if (!\Bitrix\Main\Loader::includeModule('im'))
			return false;

		$message = '';

		$messageFields = $joinFields;
		$messageFields['DIALOG_ID'] = $dialogId;

		if ($messageFields['CHAT_TYPE'] != IM_MESSAGE_PRIVATE)
		{
			$groupLimited = self::getMessage('GROUP_LIMITED');
			if ($groupLimited)
			{
				self::sendMessage(Array(
					'DIALOG_ID' => $messageFields['DIALOG_ID'],
					'MESSAGE' => $groupLimited,
					'SYSTEM' => 'N',
					'URL_PREVIEW' => 'N'
				));
			}

			$chat = new \CIMChat(self::getBotId());
			$chat->DeleteUser(substr($dialogId, 4), self::getBotId());

			return true;
		}

		if (
			self::isActivePartnerSupport()
			&& !self::isUserIntegrator($messageFields['USER_ID'])
		)
		{
			$message = self::getMessage('MESSAGE_PARTNER');
		}
		else if (self::getSupportLevel() == self::SUPPORT_LEVEL_FREE)
		{
			if (self::isUserIntegrator($messageFields['USER_ID']))
			{
				$message = self::getMessage('WELCOME_INTEGRATOR');
			}
			else if (self::isActiveFreeSupport())
			{
				if (self::isActiveFreeSupportForUser($messageFields['USER_ID']))
				{
					$message = self::getMessage('WELCOME');
				}
				else
				{
					$message = self::getMessage('WELCOME_LIMITED');
				}
			}
			else
			{
				$message = self::getMessage('WELCOME_END');
			}
		}
		else if (self::getSupportLevel() == self::SUPPORT_LEVEL_PAID)
		{
			if (self::isUserIntegrator($messageFields['USER_ID']))
			{
				$message = self::getMessage('WELCOME_INTEGRATOR');
			}
			else if (self::isActivePaidSupportForUser($messageFields['USER_ID']))
			{
				$message = self::getMessage('WELCOME');
			}
			else
			{
				$message = self::getMessage('WELCOME_LIMITED');
			}
		}

		if (empty($message))
		{
			return true;
		}

		\CUserOptions::SetOption("imbot", 'support24_welcome_message', time(), false, $messageFields['USER_ID']);

		self::sendMessage(Array(
			'DIALOG_ID' => $messageFields['USER_ID'],
			'MESSAGE' => $message,
			'SYSTEM' => 'N',
			'URL_PREVIEW' => 'N'
		));

		if (
			self::getSupportLevel() == self::SUPPORT_LEVEL_FREE
			&& self::isActiveFreeSupport()
			&& self::isActiveFreeSupportForUser($messageFields['USER_ID'])
		)
		{
			self::scheduleAction($messageFields['USER_ID'], self::SCHEDULE_ACTION_INVOLVEMENT, '', 24*60);
		}

		return true;
	}

	public static function onMessageAdd($messageId, $messageFields)
	{
		if (!\Bitrix\Main\Loader::includeModule('im'))
			return false;

		if ($messageFields['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE)
		{
			$groupLimited = self::getMessage('GROUP_LIMITED');
			if ($groupLimited)
			{
				self::sendMessage(Array(
					'DIALOG_ID' => 'chat'.$messageFields['CHAT_ID'],
					'MESSAGE' => $groupLimited,
					'SYSTEM' => 'N',
					'URL_PREVIEW' => 'N'
				));
			}

			$chat = new \CIMChat(self::getBotId());
			$chat->DeleteUser($messageFields['CHAT_ID'], self::getBotId());

			return true;
		}

		$message = '';

		if (
			self::isActivePartnerSupport()
			&& !self::isUserIntegrator($messageFields['USER_ID'])
		)
		{
			$message = self::getMessage('MESSAGE_PARTNER');
		}
		else if (self::getSupportLevel() == self::SUPPORT_LEVEL_FREE)
		{
			if (self::isActiveFreeSupport())
			{
				if (!self::isActiveFreeSupportForUser($messageFields['FROM_USER_ID']))
				{
					$message = self::getMessage('MESSAGE_LIMITED');
				}
			}
			else if (!self::isUserIntegrator($messageFields['FROM_USER_ID']))
			{
				$message = self::getMessage('MESSAGE_END');
			}
		}
		else if (self::getSupportLevel() == self::SUPPORT_LEVEL_PAID)
		{
			if (!self::isActivePaidSupportForUser($messageFields['FROM_USER_ID']))
			{
				$message = self::getMessage('MESSAGE_LIMITED');
			}
		}

		if (!empty($message))
		{
			self::sendMessage(Array(
				'DIALOG_ID' => $messageFields['FROM_USER_ID'],
				'MESSAGE' => $message,
				'SYSTEM' => 'N',
				'URL_PREVIEW' => 'N'
			));

			return true;
		}

		return parent::onMessageAdd($messageId, $messageFields);
	}

	public static function onStartWriting($params)
	{
		if (self::isActivePartnerSupport())
		{
			if (!self::isUserIntegrator($params['USER_ID']))
			{
				return false;
			}
		}

		if (self::getSupportLevel() == self::SUPPORT_LEVEL_FREE)
		{
			if (self::isActiveFreeSupport())
			{
				if (!self::isActiveFreeSupportForUser($params['USER_ID']))
				{
					return false;
				}
			}
			else if (!self::isUserIntegrator($params['USER_ID']))
			{
				return false;
			}
		}
		else if (self::getSupportLevel() == self::SUPPORT_LEVEL_PAID)
		{
			if (!self::isActivePaidSupportForUser($params['USER_ID']))
			{
				return false;
			}
		}

		return parent::onStartWriting($params);
	}

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

		if (!\Bitrix\Main\Loader::includeModule('bitrix24'))
			return false;

		if (!self::getBotId())
			return false;

		$previousDemoState = \Bitrix\Main\Config\Option::get('imbot', "support24_demo_active", false);

		$previousSupportLevel = \Bitrix\Main\Config\Option::get('imbot', "support24_support_level", "free");
		$currentSupportLevel = self::getSupportLevel();

		$isPreviousSupportLevelPartner = $previousSupportLevel === self::SUPPORT_LEVEL_PARTNER;

		$currentLicence = \CBitrix24::getLicenseType(\CBitrix24::LICENSE_TYPE_CURRENT);

		$currentDemoState = $currentLicence == 'demo';
		\Bitrix\Main\Config\Option::set('imbot', "support24_demo_active", $currentDemoState);

		$isSupportLevelChange = $previousSupportLevel != $currentSupportLevel;
		$isDemoLevelChange = $previousDemoState != $currentDemoState;

		if (!$isSupportLevelChange && !$isDemoLevelChange)
		{
			return true;
		}

		if ($isSupportLevelChange)
		{
			\Bitrix\Main\Config\Option::set('imbot', "support24_support_level", $currentSupportLevel);
		}

		$previousLicence = \CBitrix24::getLicenseType(\CBitrix24::LICENSE_TYPE_PREVIOUS);
		$currentLicence = \CBitrix24::getLicenseType(\CBitrix24::LICENSE_TYPE_CURRENT);

		if (self::getSupportLevel() == self::SUPPORT_LEVEL_PAID)
		{
			$previousCode = \Bitrix\Main\Config\Option::get('imbot', "support24_free_code", "");
			$currentCode = \Bitrix\Main\Config\Option::get('imbot', "support24_paid_code", "");
		}
		else
		{
			$previousCode = \Bitrix\Main\Config\Option::get('imbot', "support24_paid_code", "");
			$currentCode = \Bitrix\Main\Config\Option::get('imbot', "support24_free_code", "");
		}

		if ($isPreviousSupportLevelPartner)
		{
			$previousCode = self::getPartnerCode();
		}

		if ($isSupportLevelChange)
		{
			self::deleteScheduledAction(self::SCHEDULE_DELETE_ALL);
		}

		if ($currentLicence == 'demo')
		{
			\Bitrix\Main\Config\Option::set('imbot', 'support24_free_start_date', time());
		}

		self::updateBotProperties();

		self::sendNotifyAboutChangeLevel([
			'BUSINESS_USERS' => self::getBusinessUsers(),
			'IS_SUPPORT_LEVEL_CHANGE' => $isSupportLevelChange,
			'IS_DEMO_LEVEL_CHANGE' => $isDemoLevelChange,
		]);

		\Bitrix\Main\Config\Option::set('imbot', "network_".$previousCode."_bot_id", 0);
		\Bitrix\Main\Config\Option::set('imbot', "network_".$currentCode."_bot_id", self::getBotId());

		$http = new \Bitrix\ImBot\Http(parent::BOT_CODE);
		$http->query(
			'clientChangeLicence',
			Array(
				'BOT_ID' => self::getBotId(),
				'PREVIOUS_LICENCE_TYPE' => $previousLicence,
				'PREVIOUS_LICENCE_NAME' => \CBitrix24::getLicenseName($previousLicence),
				'CURRENT_LICENCE_TYPE' => $currentLicence,
				'CURRENT_LICENCE_NAME' => \CBitrix24::getLicenseName($currentLicence),
				'PREVIOUS_BOT_CODE' => $previousCode,
				'CURRENT_BOT_CODE' => $currentCode,
				'MESSAGE' => self::getMessage('SUPPORT_INFO_CHANGE_CODE', $previousSupportLevel),
			),
			false
		);

		return true;
	}

	public static function onAfterSupportCodeChange($previousFreeCode = '', $previousPaidCode = '')
	{
		if (!\Bitrix\Main\Loader::includeModule('im'))
			return false;

		if (!\Bitrix\Main\Loader::includeModule('bitrix24'))
			return false;

		if (!self::getBotId())
			return false;

		$currentLicence = \CBitrix24::getLicenseType(\CBitrix24::LICENSE_TYPE_CURRENT);

		$previousSupportLevel = self::getSupportLevel() == self::SUPPORT_LEVEL_PAID? self::SUPPORT_LEVEL_FREE: self::SUPPORT_LEVEL_PAID;

		if (self::getSupportLevel() == self::SUPPORT_LEVEL_PAID)
		{
			if (!$previousPaidCode)
			{
				return false;
			}

			$previousCode = $previousPaidCode;
			$currentCode = \Bitrix\Main\Config\Option::get('imbot', "support24_paid_code", "");
		}
		else
		{
			if (!$previousFreeCode)
			{
				return false;
			}

			$previousCode = $previousFreeCode;
			$currentCode = \Bitrix\Main\Config\Option::get('imbot', "support24_free_code", "");
		}

		self::updateBotProperties();

		self::sendNotifyAboutChangeLevel([
			'BUSINESS_USERS' => self::getBusinessUsers(),
			'IS_SUPPORT_CODE_CHANGE' => true,
		]);

		\Bitrix\Main\Config\Option::set('imbot', "network_".$previousCode."_bot_id", 0);
		\Bitrix\Main\Config\Option::set('imbot', "network_".$currentCode."_bot_id", self::getBotId());

		$http = new \Bitrix\ImBot\Http(parent::BOT_CODE);
		$http->query(
			'clientChangeLicence',
			Array(
				'BOT_ID' => self::getBotId(),
				'PREVIOUS_LICENCE_TYPE' => $currentLicence,
				'PREVIOUS_LICENCE_NAME' => \CBitrix24::getLicenseName($currentLicence),
				'CURRENT_LICENCE_TYPE' => $currentLicence,
				'CURRENT_LICENCE_NAME' => \CBitrix24::getLicenseName($currentLicence),
				'PREVIOUS_BOT_CODE' => $previousCode,
				'CURRENT_BOT_CODE' => $currentCode,
				'MESSAGE' => self::getMessage('SUPPORT_INFO_CHANGE_CODE', $previousSupportLevel),
			),
			false
		);

		return true;
	}

	public static function onCommandAdd($messageId, $messageFields)
	{
		if ($messageFields['SYSTEM'] === 'Y')
			return false;

		if ($messageFields['COMMAND_CONTEXT'] !== 'KEYBOARD')
			return false;

		if ($messageFields['MESSAGE_TYPE'] !== IM_MESSAGE_PRIVATE)
			return false;

		if ($messageFields['COMMAND'] !== 'support24')
			return false;

		if ($messageFields['TO_USER_ID'] != self::getBotId())
			return false;

		$messageParams = [];

		if ($messageFields['COMMAND_PARAMS'] === 'activatePartnerSupport')
		{
			$keyboard = new \Bitrix\Im\Bot\Keyboard(self::getBotId());
			$keyboard->addButton(Array(
				"DISPLAY" => "LINE",
				"TEXT" => self::getMessage('PARTNER_BUTTON_MANAGE'),
				"LINK" => self::getMessage('PARTNER_BUTTON_MANAGE_URL'),
				"CONTEXT" => "DESKTOP",
			));
			$messageParams['KEYBOARD'] = $keyboard;

			$attach = new \CIMMessageParamAttach(null, \CIMMessageParamAttach::NORMAL);
			$attach->AddMessage(self::getMessage('PARTNER_REQUEST_PROCESSED'));
			$messageParams['ATTACH'] = $attach;

			$result = Partner24::acceptRequest($messageFields['FROM_USER_ID']);
			if (!$result)
			{
				return false;
			}
		}
		else
		{
			if ($messageFields['COMMAND_PARAMS'] === 'deactivatePartnerSupport')
			{
				Partner24::deactivate($messageFields['FROM_USER_ID']);

				$attach = new \CIMMessageParamAttach(null, \CIMMessageParamAttach::NORMAL);
				$attach->AddMessage(self::getMessage('PARTNER_REQUEST_PROCESSED'));
				$messageParams['ATTACH'] = $attach;
			}
			else if ($messageFields['COMMAND_PARAMS'] === 'declinePartnerRequest')
			{
				Partner24::declineRequest($messageFields['FROM_USER_ID']);

				$attach = new \CIMMessageParamAttach(null, \CIMMessageParamAttach::PROBLEM);
				$attach->AddMessage(self::getMessage('PARTNER_REQUEST_REJECTED'));
				$messageParams['ATTACH'] = $attach;
			}
			$messageParams['KEYBOARD'] = 'N';
		}

		\CIMMessageParam::Set($messageId, $messageParams);
		\CIMMessageParam::SendPull($messageId, ['ATTACH', 'KEYBOARD']);

		return true;
	}


	public static function sendNotifyAboutChangeLevel($params)
	{
		if (self::isActivePartnerSupport())
		{
			return false;
		}

		$businessUsers = $params['BUSINESS_USERS'];
		$isSupportLevelChange = (bool)$params['IS_SUPPORT_LEVEL_CHANGE'];
		$isSupportCodeChange = (bool)$params['IS_SUPPORT_CODE_CHANGE'];
		$isDemoLevelChange = (bool)$params['IS_DEMO_LEVEL_CHANGE'];

		$query = "
			SELECT
				RU.USER_ID,
				RU.CHAT_ID,
				IF(UNIX_TIMESTAMP(M.DATE_CREATE) > UNIX_TIMESTAMP()-86400*7, 'Y', 'N') RECENTLY_TALK
			FROM
				b_im_relation RB,
				b_im_relation RU LEFT JOIN b_im_message M ON RU.LAST_ID = M.ID
			WHERE
				RB.USER_ID = ".self::getBotId()."
			and RU.USER_ID != ".self::getBotId()."
			and RB.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
			and RU.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
			and RB.CHAT_ID = RU.CHAT_ID
		";
		$dialogs = \Bitrix\Main\Application::getInstance()->getConnection()->query($query)->fetchAll();

		if (self::getSupportLevel() == self::SUPPORT_LEVEL_PAID)
		{
			foreach ($dialogs as $dialog)
			{
				if ($dialog['USER_ID'] == self::getBotId())
				{
					continue;
				}

				$message = '';

				if ($isSupportLevelChange)
				{
					if (self::isActivePaidSupportForUser($dialog['USER_ID']))
					{
						$message = self::getMessage('CHANGE_ADMIN');
					}
					else
					{
						$message = self::getMessage('CHANGE_USER');
					}
				}
				else if ($isDemoLevelChange)
				{
					if (self::isActivePaidSupportForUser($dialog['USER_ID']))
					{
						$message = self::getMessage('CHANGE_DEMO');
					}
				}
				else if ($isSupportCodeChange)
				{
					if (self::isActivePaidSupportForUser($dialog['USER_ID']))
					{
						$message = self::getMessage('CHANGE_CODE');
					}
				}

				if (!$message)
				{
					continue;
				}

				if ($dialog['RECENTLY_TALK'] == 'Y')
				{
					self::sendMessage(Array(
						'DIALOG_ID' => $dialog['USER_ID'],
						'MESSAGE' => $message,
						'SYSTEM' => 'N',
						'URL_PREVIEW' => 'N'
					));
				}
				else
				{
					\Bitrix\Im\Model\MessageTable::add(Array(
						'CHAT_ID' => $dialog['CHAT_ID'],
						'AUTHOR_ID' => self::getBotId(),
						'MESSAGE' => self::replacePlaceholders($message, $dialog['USER_ID'])
					));
				}
			}
		}
		else
		{
			$isActiveFreeSupport = self::isActiveFreeSupport();

			foreach ($dialogs as $dialog)
			{
				if ($dialog['USER_ID'] == self::getBotId())
				{
					continue;
				}

				$message = '';

				if ($isSupportLevelChange)
				{
					if ($isActiveFreeSupport)
					{
						if (is_array($businessUsers) && in_array($dialog['USER_ID'], $businessUsers))
						{
							$message = self::getMessage('CHANGE_BUSINESS');
						}
						else
						{
							$message = self::getMessage('CHANGE_ADMIN');
						}
					}
					else
					{
						$message = self::getMessage('CHANGE_END');
					}
				}
				else if ($isDemoLevelChange)
				{
					if ($isActiveFreeSupport)
					{
						$message = self::getMessage('CHANGE_DEMO');
					}
				}
				else if ($isSupportCodeChange)
				{
					if ($isActiveFreeSupport)
					{
						$message = self::getMessage('CHANGE_CODE');
					}
				}

				if (!$message)
				{
					continue;
				}

				if ($dialog['RECENTLY_TALK'] == 'Y')
				{
					self::sendMessage(Array(
						'DIALOG_ID' => $dialog['USER_ID'],
						'MESSAGE' => $message,
						'SYSTEM' => 'N',
						'URL_PREVIEW' => 'N'
					));
				}
				else
				{
					\Bitrix\Im\Model\MessageTable::add(Array(
						'CHAT_ID' => $dialog['CHAT_ID'],
						'AUTHOR_ID' => self::getBotId(),
						'MESSAGE' => self::replacePlaceholders($message, $dialog['USER_ID'])
					));
				}
			}
		}

		return true;
	}

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

		if (!\Bitrix\Main\Loader::includeModule('bitrix24'))
			return false;

		if (!self::getBotId())
			return false;

		$currentLicence = \CBitrix24::getLicenseType(\CBitrix24::LICENSE_TYPE_CURRENT);

		if (self::getSupportLevel() == self::SUPPORT_LEVEL_PAID)
		{
			$currentCode = \Bitrix\Main\Config\Option::get('imbot', "support24_paid_code", "");
		}
		else
		{
			$currentCode = \Bitrix\Main\Config\Option::get('imbot', "support24_free_code", "");
		}

		$http = new \Bitrix\ImBot\Http(parent::BOT_CODE);
		$http->query(
			'clientRequestFinalizeSession',
			Array(
				'BOT_ID' => self::getBotId(),
				'CURRENT_LICENCE_TYPE' => $currentLicence,
				'CURRENT_LICENCE_NAME' => \CBitrix24::getLicenseName($currentLicence),
				'CURRENT_BOT_CODE' => $currentCode,
				'MESSAGE' => $message,
			),
			false
		);

		return true;
	}

	public static function onAfterUserAuthorize($params)
	{
		$auth = \CHTTP::ParseAuthRequest();
		if (
			isset($auth["basic"]) && $auth["basic"]["username"] <> '' && $auth["basic"]["password"] <> ''
			&& strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'bitrix') === false
		)
		{
			return true;
		}

		if (isset($params['update']) && $params['update'] === false)
		{
			return true;
		}

		if ($params['user_fields']['ID'] <= 0)
		{
			return true;
		}

		$params['user_fields']['ID'] = intval($params['user_fields']['ID']);

		if (isset($_SESSION['SUPPORT24'][$params['user_fields']['ID']]['WELCOME']))
		{
			return true;
		}

		if (self::getSupportLevel() != self::SUPPORT_LEVEL_FREE)
		{
			$_SESSION['SUPPORT24'][$params['user_fields']['ID']]['WELCOME'] = time();
			return true;
		}

		$martaCheck = \CUserOptions::GetOption("imbot", 'support24_welcome_message', 0, $params['user_fields']['ID']);
		if ($martaCheck > 0)
		{
			$_SESSION['SUPPORT24'][$params['user_fields']['ID']]['WELCOME'] = $martaCheck;
			return true;
		}

		$_SESSION['SUPPORT24'][$params['user_fields']['ID']]['WELCOME'] = time();

		if (self::isActiveFreeSupport() && self::isActiveFreeSupportForUser($params['user_fields']['ID']))
		{
			self::scheduleAction($params['user_fields']['ID'], self::SCHEDULE_ACTION_WELCOME, '', 10);
		}

		\CUserOptions::SetOption("imbot", 'support24_welcome_message', time(), false, $params['user_fields']['ID']);

		return true;
	}

	public static function updateBotProperties()
	{
		if (!\Bitrix\Main\Loader::includeModule('im'))
		{
			return false;
		}

		if (!self::getBotId())
		{
			return false;
		}

		$botData = \Bitrix\Im\User::getInstance(self::getBotId());
		$userAvatar = \Bitrix\Im\User::uploadAvatar(self::getBotAvatar(), self::getBotId());
		if ($userAvatar && $botData->getAvatarId() != $userAvatar)
		{
			$connection = \Bitrix\Main\Application::getConnection();
			$connection->query("UPDATE b_user SET PERSONAL_PHOTO = ".intval($userAvatar)." WHERE ID = ".intval(self::getBotId()));
		}

		$botCache = \Bitrix\Im\Bot::getCache(self::getBotId());
		if ($botCache['APP_ID'] !== self::getBotCode())
		{
			\Bitrix\Main\Config\Option::set(self::MODULE_ID, parent::BOT_CODE.'_'.$botCache['APP_ID']."_bot_id", 0);
			\Bitrix\Main\Config\Option::set(self::MODULE_ID, parent::BOT_CODE.'_'.self::getBotCode()."_bot_id", self::getBotId());
		}

		\Bitrix\Im\Bot::update(Array('BOT_ID' => self::getBotId()), Array(
			'CLASS' => __CLASS__,
			'METHOD_MESSAGE_ADD' => 'onMessageAdd',
			'METHOD_WELCOME_MESSAGE' => 'onWelcomeMessage',
			'TEXT_CHAT_WELCOME_MESSAGE' => '',
			'TEXT_PRIVATE_WELCOME_MESSAGE' => '',
			'VERIFIED' => 'Y',
			'CODE' => 'network_'.self::getBotCode(),
			'APP_ID' => self::getBotCode(),
		));

		$user = new \CUser;
		$user->Update(self::getBotId(), Array(
			'LOGIN' => 'bot_imbot_support24',
			'NAME' => self::getBotName(),
			'WORK_POSITION' => self::getBotDesc()
		));

		return true;
	}

	public static function sendMessage($messageFields)
	{
		if (!\Bitrix\Main\Loader::includeModule('im'))
		{
			return [];
		}

		$userId = 0;

		if (isset($messageFields['TO_USER_ID']))
		{
			$userId = $messageFields['TO_USER_ID'];
		}
		else if (isset($messageFields['DIALOG_ID']))
		{
			if (preg_match('/^[0-9]{1,}$/i', $messageFields['DIALOG_ID']))
			{
				$userId = $messageFields['DIALOG_ID'];
			}
			else if (
				$messageFields['DIALOG_ID'] === 'ADMIN'
				|| $messageFields['DIALOG_ID'] === 'BUSINESS'
			)
			{
				if ($messageFields['DIALOG_ID'] === 'ADMIN')
				{
					$users = self::getAdministrators();
				}
				else if ($messageFields['DIALOG_ID'] === 'BUSINESS')
				{
					$users = self::getBusinessUsers();
				}

				$result = [];
				foreach ($users as $userId)
				{
					$messageFields['DIALOG_ID'] = $userId;
					$result = array_merge($result, self::sendMessage($messageFields));
				}

				return $result;
			}
		}

		$messageFields['FROM_USER_ID'] = self::getBotId();
		$messageFields['PARAMS']['IMOL_QUOTE_MSG'] = 'Y';

		$messageFields['MESSAGE'] = self::replacePlaceholders($messageFields['MESSAGE'], $userId);

		$messageId = \CIMMessenger::Add($messageFields);
		if ($messageId)
		{
			return [$messageId];
		}

		return [];
	}

	public static function replacePlaceholders($message, $userId = 0)
	{
		if (!\Bitrix\Main\Loader::includeModule('im'))
		{
			return $message;
		}

		if ($userId)
		{
			$message = str_replace(Array(
				'#USER_NAME#',
				'#USER_LAST_NAME#',
				'#USER_FULL_NAME#',
			), Array(
				\Bitrix\Im\User::getInstance($userId)->getName(false),
				\Bitrix\Im\User::getInstance($userId)->getLastName(false),
				\Bitrix\Im\User::getInstance($userId)->getFullName(false),
			), $message);
		}

		if (!\Bitrix\Main\Loader::includeModule('bitrix24'))
		{
			return $message;
		}

		$currentLicence = \CBitrix24::getLicenseType(\CBitrix24::LICENSE_TYPE_CURRENT);
		$previousLicence = \CBitrix24::getLicenseType(\CBitrix24::LICENSE_TYPE_PREVIOUS);

		$currentLicenceName = \CBitrix24::getLicenseName($currentLicence);
		$currentLicenceName = $currentLicenceName? $currentLicenceName: $currentLicence;

		$previousLicenceName = \CBitrix24::getLicenseName($previousLicence);
		$previousLicenceName = $previousLicenceName? $previousLicenceName: $previousLicence;

		$message = str_replace(Array(
			'#SUPPORT_ID#',
			'#SUPPORT_NAME#',
			'#TARIFF_NAME#',
			'#TARIFF_CODE#',
			'#PREVIOUS_TARIFF_NAME#',
			'#PREVIOUS_TARIFF_CODE#',
		), Array(
			self::getBotId(),
			self::getBotName(),
			$currentLicenceName,
			$currentLicence,
			$previousLicenceName,
			$previousLicence,
		), $message);

		if (self::isEnabled())
		{
			$message = str_replace(Array(
				'#PARTNER_NAME#',
				'#PARTNER_BOT_ID#',
				'#PARTNER_BOT_NAME#',
			), Array(
				Partner24::getPartnerName(),
				Partner24::getBotId(),
				Partner24::getBotName(),
			), $message);
		}

		return $message;
	}

	public static function scheduleAction($userId, $action, $code = '', $delayMinutes = 1)
	{
		if (!($userId === 'ADMIN' || $userId === 'BUSINESS'))
		{
			$userId = intval($userId);
			if ($userId <= 0)
			{
				return false;
			}
		}

		$result = \CAgent::GetList(array(), array('MODULE_ID'=>'imbot', '=NAME'=> __CLASS__."::scheduledActionAgent(".$userId.", '".$action."', '".$code."');"));
		while($agent = $result->Fetch())
		{
			\CAgent::Delete($agent['ID']);
		}

		$delaySeconds = intval($delayMinutes) * 60;

		\CAgent::AddAgent(__CLASS__."::scheduledActionAgent(".$userId.", '".$action."', '".$code."');", "imbot", "N", $delaySeconds, "", "Y", ConvertTimeStamp(time()+\CTimeZone::GetOffset()+$delaySeconds, "FULL"));

		return true;
	}

	public static function deleteScheduledAction($userId = null, $action = '', $code = '')
	{
		if (!($userId === 'ADMIN' || $userId === 'BUSINESS'))
		{
			$userId = intval($userId);
		}
		$action = trim($action);
		$code = trim($code);

		$filter = array('MODULE_ID' => 'imbot' );

		if (!$userId)
		{
			$filter['NAME'] = __CLASS__."::scheduledActionAgent(%";
		}
		else
		{
			if ($action && $code)
			{
				$filter['=NAME'] = __CLASS__."::scheduledActionAgent(".$userId.", '".$action."', '".$code."');";
			}
			else if ($action)
			{
				$filter['NAME'] = __CLASS__."::scheduledActionAgent(".$userId.", '".$action."', %";
			}
			else
			{
				$filter['NAME'] = __CLASS__."::scheduledActionAgent(".$userId.", %";
			}
		}

		$result = \CAgent::GetList(array(), $filter);
		while($agent = $result->Fetch())
		{
			\CAgent::Delete($agent['ID']);
		}

		return true;
	}

	public static function scheduledActionAgent($userId, $action, $code = '')
	{
		self::execScheduleAction($userId, $action, $code);

		return "";
	}

	public static function execScheduleAction($userId, $action, $code = '')
	{
		if (!\Bitrix\Main\Loader::includeModule('im'))
		{
			return false;
		}

		if (!($userId === 'ADMIN' || $userId === 'BUSINESS'))
		{
			$userId = intval($userId);
			if ($userId <= 0)
			{
				return false;
			}
		}

		if ($action == self::SCHEDULE_ACTION_WELCOME)
		{
			if (self::getSupportLevel() != self::SUPPORT_LEVEL_FREE)
			{
				return true;
			}
			else if (!self::isActiveFreeSupport() || !self::isActiveFreeSupportForUser($userId))
			{
				return true;
			}

			\CIMMessage::GetChatId($userId, self::getBotId());
		}
		else if ($action == self::SCHEDULE_ACTION_INVOLVEMENT)
		{
			if (self::getSupportLevel() != self::SUPPORT_LEVEL_FREE)
			{
				return true;
			}
			else if (!self::isActiveFreeSupport() || !self::isActiveFreeSupportForUser($userId))
			{
				return true;
			}

			$generationDate = (int)\Bitrix\Main\Config\Option::get('imbot', 'support24_free_start_date', 0);
			$currentDay = floor((time() - $generationDate) / 86400) + 1;

			self::scheduleAction($userId, self::SCHEDULE_ACTION_INVOLVEMENT, '', 24*60);

			$message = self::getMessage($currentDay);
			if (strlen($message) <= 0)
			{
				return false;
			}

			$lastMessageMinTime = self::INVOLVEMENT_LAST_MESSAGE_BLOCK_TIME * 60 * 60; // hour to second

			$query = "
				SELECT
					RU.USER_ID,
					RU.CHAT_ID,
					IF(UNIX_TIMESTAMP(MB.DATE_CREATE) > UNIX_TIMESTAMP()-".$lastMessageMinTime.", 'Y', 'N') BOT_RECENTLY_TALK,
					IF(UNIX_TIMESTAMP(MU.DATE_CREATE) > UNIX_TIMESTAMP()-".$lastMessageMinTime.", 'Y', 'N') USER_RECENTLY_TALK
				FROM
					b_im_relation RB LEFT JOIN b_im_message MB ON RB.LAST_ID = MB.ID,
					b_im_relation RU LEFT JOIN b_im_message MU ON RU.LAST_ID = MU.ID
				WHERE
					RB.USER_ID = ".self::getBotId()."
				and RU.USER_ID = ".$userId."
				and RB.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
				and RU.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
				and RB.CHAT_ID = RU.CHAT_ID
			";
			$dialog = \Bitrix\Main\Application::getInstance()->getConnection()->query($query)->fetch();

			if (
				$dialog['BOT_RECENTLY_TALK'] == 'Y'
				|| $dialog['USER_RECENTLY_TALK'] == 'Y'
			)
			{
				return false;
			}

			self::sendMessage(Array(
				'DIALOG_ID' => $userId,
				'MESSAGE' => $message,
				'SYSTEM' => 'N',
				'URL_PREVIEW' => 'N'
			));

			return true;
		}
		else if ($action == self::SCHEDULE_ACTION_MESSAGE)
		{
			$code = trim($code);
			if (strlen($code) <= 0)
			{
				return false;
			}

			$message = self::getMessage($code);
			if (strlen($message) <= 0)
			{
				return false;
			}

			self::sendMessage(Array(
				'DIALOG_ID' => $userId,
				'MESSAGE' => $message,
				'SYSTEM' => 'N',
				'URL_PREVIEW' => 'N'
			));
		}
		else if ($action == self::SCHEDULE_ACTION_PARTNER_JOIN)
		{
			$keyboard = new \Bitrix\Im\Bot\Keyboard(self::getBotId());
			$keyboard->addButton(Array(
				"DISPLAY" => "LINE",
				"TEXT" => self::getMessage('PARTNER_BUTTON_YES'),
				"BG_COLOR" => "#29619b",
				"TEXT_COLOR" => "#fff",
				"BLOCK" => "Y",
				"COMMAND" => "support24",
				"COMMAND_PARAMS" => "activatePartnerSupport",
			));
			$keyboard->addButton(Array(
				"DISPLAY" => "LINE",
				"TEXT" => self::getMessage('PARTNER_BUTTON_NO'),
				"BG_COLOR" => "#990000",
				"TEXT_COLOR" => "#fff",
				"BLOCK" => "Y",
				"COMMAND" => "support24",
				"COMMAND_PARAMS" => "declinePartnerRequest",
			));

			self::sendMessage(Array(
				'DIALOG_ID' => $userId,
				'MESSAGE' => self::getMessage('PARTNER_REQUEST'),
				'KEYBOARD' => $keyboard,
				'SYSTEM' => 'N',
				'URL_PREVIEW' => 'N'
			));

			return true;
		}
		else
		{
			return false;
		}

		return true;
	}

	public static function getMessage($code, $supportLevel = null)
	{
		if (!$supportLevel)
		{
			$supportLevel = self::getSupportLevel();
		}
		$supportLevel = strtolower($supportLevel);

		if (substr($code, 0, 4) == 'DAY_')
		{
			$code = substr($code, 4);
		}

		$optionCode = $supportLevel == self::SUPPORT_LEVEL_FREE? "support24_free_messages": "support24_paid_messages";
		$messages = unserialize(\Bitrix\Main\Config\Option::get('imbot', $optionCode, "a:0:{}"));

		return isset($messages[$code])? $messages[$code]: '';
	}
}