Your IP : 3.16.137.217


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/marta.php

<?php
namespace Bitrix\ImBot\Bot;

use Bitrix\Main\Localization\Loc;

Loc::loadMessages(__FILE__);

class Marta extends Base
{
	const BOT_CODE = "marta";
	const EDIT_PHRASE = '*EDIT*';

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

		$language = null;
		if (isset($params['LANG']))
		{
			$language = $params['LANG'];
			Loc::loadLanguageFile(__FILE__, $language);
		}
		$language = in_array($language, Array('ru', 'en'))? $language: 'ru';

		$agentMode = isset($params['AGENT']) && $params['AGENT'] == 'Y';

		if (self::getBotId())
			return $agentMode? "": self::getBotId();

		$birthday = new \Bitrix\Main\Type\DateTime(Loc::getMessage('IMBOT_BOT_BIRTHDAY', null, $language).' 19:45:00', 'Y-m-d H:i:s');
		$birthday = $birthday->format(\Bitrix\Main\Type\Date::convertFormatToPhp(\CSite::GetDateFormat('SHORT')));

		$botId = \Bitrix\Im\Bot::register(Array(
			'CODE' => self::BOT_CODE,
			'TYPE' => \Bitrix\Im\Bot::TYPE_HUMAN,
			'MODULE_ID' => self::MODULE_ID,
			'CLASS' => __CLASS__,
			'LANG' => $language,
			'OPENLINE' => 'Y',
			'INSTALL_TYPE' => \Bitrix\Im\Bot::INSTALL_TYPE_SILENT,
			'METHOD_MESSAGE_ADD' => 'onMessageAdd',
			'METHOD_WELCOME_MESSAGE' => 'onChatStart',
			'METHOD_BOT_DELETE' => 'onBotDelete',
			'PROPERTIES' => Array(
				'NAME' => Loc::getMessage('IMBOT_BOT_NAME', null, $language),
				'COLOR' => Loc::getMessage('IMBOT_BOT_COLOR', null, $language),
				//'EMAIL' => Loc::getMessage('IMBOT_BOT_EMAIL', null, $language),
				'PERSONAL_BIRTHDAY' => $birthday,
				'WORK_POSITION' => Loc::getMessage('IMBOT_BOT_WORK_POSITION', null, $language),
				'PERSONAL_WWW' => Loc::getMessage('IMBOT_BOT_SITE', null, $language),
				'PERSONAL_GENDER' => Loc::getMessage('IMBOT_BOT_GENDER', null, $language),
				'PERSONAL_PHOTO' => self::uploadAvatar($language),
			)
		));
		if ($botId)
		{
			self::setBotId($botId);

			$eventManager = \Bitrix\Main\EventManager::getInstance();
			$eventManager->registerEventHandlerCompatible("timeman", "OnAfterTMDayStart", self::MODULE_ID, __CLASS__,  "onAfterTmDayStart");

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

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

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

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

			if (\Bitrix\Main\Loader::includeModule('bitrix24'))
			{
				\Bitrix\Im\Command::register(Array(
					'MODULE_ID' => "bitrix24",
					'BOT_ID' => $botId,
					'HIDDEN' => 'Y',
					'COMMAND' => 'supportAccess',
					'CLASS' => "CBitrix24EventHandlers",
					'METHOD_COMMAND_ADD' => 'OnSupportAccess'
				));

				if (!\CBitrix24::isDomainChanged())
				{
					RegisterModuleDependences("bitrix24", "OnDomainChange", self::MODULE_ID, __CLASS__, "onRenamePortalDomainChange");
					\CAgent::AddAgent('\\Bitrix\\ImBot\\Bot\\Marta::addRenameMessageAgent();', "imbot", "N", 86400, "", "Y", \ConvertTimeStamp(time()+\CTimeZone::GetOffset()+86400, "FULL"));
				}
			}

			\Bitrix\Im\App::register(Array(
				'MODULE_ID' => 'imbot',
				'BOT_ID' => $botId,
				'CODE' => 'play',
				'ICON_ID' => self::uploadIcon('play'),
				'CLASS' => __CLASS__,
				'METHOD_LANG_GET' => 'onAppLang',
				'JS' => 'BXIM.sendMessage("/play")',
				'CONTEXT' => 'bot',
			));
		}

		return $agentMode? "": $botId;
	}

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

		$result = \Bitrix\Im\Bot::unRegister(Array('BOT_ID' => self::getBotId()));
		if ($result)
		{
			self::setBotId(0);

			$eventManager = \Bitrix\Main\EventManager::getInstance();
			$eventManager->unRegisterEventHandler("timeman", "OnAfterTMDayStart", self::MODULE_ID, __CLASS__, "onAfterTmDayStart");
		}

		return $result;
	}

	public static function onChatStart($dialogId, $joinFields)
	{
		$botData = \Bitrix\Im\Bot::getCache(self::getBotId());
		$language = null;
		if ($botData['LANG'])
		{
			$language = $botData['LANG'];
			Loc::loadLanguageFile(__FILE__, $language);
		}

		if ($joinFields['CHAT_TYPE'] == IM_MESSAGE_PRIVATE)
		{
			$message = Loc::getMessage('IMBOT_BOT_WELCOME_MESSAGE_2', Array('#HELLO#' => self::getHelloMessage($dialogId, $language)), $language);
			\CUserOptions::SetOption(self::MODULE_ID, self::BOT_CODE.'_welcome_message', time(), false, $dialogId);
		}
		else
		{
			if ($joinFields['CHAT_ENTITY_TYPE'] == 'LINES')
			{
				$message = Loc::getMessage('IMBOT_BOT_WELCOME_MESSAGE_LINES_2', null, $language);
			}
			else
			{
				$message = Loc::getMessage('IMBOT_BOT_WELCOME_MESSAGE_CHAT_2', null, $language);
			}
		}

		if ($message)
		{
			\Bitrix\Im\Bot::startWriting(Array('BOT_ID' => self::getBotId()), $dialogId);
			self::sendAnswer(0, Array(
				'DIALOG_ID' => $dialogId,
				'ANSWER' => $message
			));
		}

		return true;
	}

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

		\Bitrix\Im\Bot::startWriting(Array('BOT_ID' => self::getBotId()), $messageFields['DIALOG_ID']);

		$userName = \Bitrix\Im\User::getInstance($messageFields['FROM_USER_ID'])->getName();

		$dateNow = new \Bitrix\Main\Type\DateTime();
		self::setBotOption($messageFields['FROM_USER_ID'], 'last_message', $dateNow->format('Ymd'));

		$botData = \Bitrix\Im\Bot::getCache(self::getBotId());

		if ($messageFields['MESSAGE'] == '0' && $messageFields['CHAT_ENTITY_TYPE'] == 'LINES')
		{
			self::sendAnswer(0, Array(
				'DIALOG_ID' => $messageFields['DIALOG_ID'],
				'ANSWER' => Loc::getMessage('IMBOT_BOT_WELCOME_LINES_REDIRECT')
			));
			return true;
		}

		if (strpos($messageFields['MESSAGE'], self::EDIT_PHRASE) !== false && \Bitrix\Im\User::getInstance($messageFields['FROM_USER_ID'])->isExtranet())
		{
			$messageFields['MESSAGE'] = str_replace(self::EDIT_PHRASE, '', $messageFields['MESSAGE']);
		}

		self::sendMessage(Array(
			'BOT_ID' => self::getBotId(),
			'BOT_LANG' => $botData['LANG'],
			'DIALOG_ID' => $messageFields['DIALOG_ID'],
			'MESSAGE_ID' => $messageId,
			'MESSAGE_TEXT' => $messageFields['MESSAGE'],
			'MESSAGE_TYPE' => $messageFields['MESSAGE_TYPE'],
			'USER_NAME' => htmlspecialcharsback($userName),
			'USER_AGE' => 30,
		));

		return true;
	}

	public static function onSettingsCommandAdd($messageId, $messageFields)
	{
		 if ($messageFields['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE)
  		    return false;

		$userName = \Bitrix\Im\User::getInstance()->getName();

		if ($messageFields['COMMAND'] == 'enable')
		{
			if ($messageFields['COMMAND_PARAMS'] == 'welcome')
			{
				$message = Loc::getMessage('IMBOT_BOT_ENABLE_WELCOME', Array('#USER_NAME#' => $userName));
				$dateNow = new \Bitrix\Main\Type\DateTime();
				\Bitrix\ImBot\Bot\Marta::setBotOption($messageFields['DIALOG_ID'], 'planner_message', $dateNow->format('Ymd'));
			}
			else
			{
				return false;
			}
		}
		else if ($messageFields['COMMAND'] == 'disable')
		{
			if ($messageFields['COMMAND_PARAMS'] == 'welcome')
			{
				$message = Loc::getMessage('IMBOT_BOT_DISABLE_WELCOME', Array('#USER_NAME#' => $userName));
				\Bitrix\ImBot\Bot\Marta::setBotOption($messageFields['DIALOG_ID'], 'planner_message', '20230219');
			}
			else
			{
				return false;
			}
		}
		else
		{
			return false;
		}

		\Bitrix\Im\Bot::startWriting(Array('BOT_ID' => $messageFields['TO_USER_ID']), $messageFields['DIALOG_ID']);

		\Bitrix\Im\Bot::addMessage(Array('BOT_ID' => $messageFields['TO_USER_ID']), Array(
		   'DIALOG_ID' => $messageFields['DIALOG_ID'],
		   'MESSAGE' => $message,
		));
	}

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

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

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

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

		$messageFields['COMMAND_PARAMS'] = trim($messageFields['COMMAND_PARAMS']);
		if (!in_array($messageFields['COMMAND_PARAMS'], Array('en', 'ru')))
			return false;

		global $GLOBALS;
		$grantAccess = \IsModuleInstalled('bitrix24')? $GLOBALS['USER']->CanDoOperation('bitrix24_config'): $GLOBALS["USER"]->IsAdmin();
		if (!$grantAccess)
			return false;

		$language = $messageFields['COMMAND_PARAMS'];
		Loc::loadLanguageFile(__FILE__, $language);

		\Bitrix\Im\Bot::startWriting(Array('BOT_ID' => self::getBotId()), $messageFields['DIALOG_ID']);

		\Bitrix\Im\Bot::update(Array('BOT_ID' => self::getBotId()), Array(
			'LANG' => $language,
			'PROPERTIES' => Array(
				'NAME' => Loc::getMessage('IMBOT_BOT_NAME', null, $language),
				'COLOR' => Loc::getMessage('IMBOT_BOT_COLOR', null, $language),
				'EMAIL' => Loc::getMessage('IMBOT_BOT_EMAIL', null, $language),
				'WORK_POSITION' => Loc::getMessage('IMBOT_BOT_WORK_POSITION', null, $language),
				'PERSONAL_WWW' => Loc::getMessage('IMBOT_BOT_SITE', null, $language),
				'PERSONAL_GENDER' => Loc::getMessage('IMBOT_BOT_GENDER', null, $language),
				'PERSONAL_PHOTO' => self::uploadAvatar($language),
			)
		));

		self::sendAnswer(0, Array(
			'DIALOG_ID' => $messageFields['DIALOG_ID'],
			'ANSWER' => Loc::getMessage('IMBOT_BOT_CHANGE_LANG', null, $language)
		));

		return true;
	}

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

		if ($messageFields['COMMAND_CONTEXT'] == 'TEXTAREA')
		{
			if (
				$messageFields['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE ||
				$messageFields['FROM_USER_ID'] == self::getBotId() ||
				$messageFields['TO_USER_ID'] == self::getBotId()
			)
			{
				\Bitrix\Im\Bot::startWriting(Array('BOT_ID' => self::getBotId()), $messageFields['DIALOG_ID']);
			}
		}

		$dateNow = new \Bitrix\Main\Type\DateTime();
		self::setBotOption($messageFields['FROM_USER_ID'], 'last_message', $dateNow->format('Ymd'));

		$botData = \Bitrix\Im\Bot::getCache(self::getBotId());

		self::sendCommand(Array(
			'BOT_ID' => self::getBotId(),
			'BOT_LANG' => $botData['LANG'],
			'DIALOG_ID' => $messageFields['DIALOG_ID'],
			'MESSAGE_ID' => $messageId,
			'MESSAGE_TEXT' => $messageFields['MESSAGE'],
			'MESSAGE_TYPE' => $messageFields['MESSAGE_TYPE'],
			'COMMAND' => $messageFields['COMMAND'],
			'COMMAND_ID' => $messageFields['COMMAND_ID'],
			'COMMAND_PARAMS' => $messageFields['COMMAND_PARAMS'],
			'COMMAND_CONTEXT' => $messageFields['COMMAND_CONTEXT'],
		));

		return true;
	}

	public static function onAnswerAdd($command, $params)
	{
		if($command == "AnswerMessage")
		{
			self::sendAnswer($params['MESSAGE_ID'], Array(
				'DIALOG_ID' => $params['DIALOG_ID'],
				'MESSAGE' => $params['MESSAGE'],
				'ANSWER' => $params['MESSAGE_ANSWER'],
				'RICH' => $params['MESSAGE_RICH'],
				'ATTACH' => isset($params['ATTACH'])? $params['ATTACH']: '',
				'KEYBOARD' => isset($params['KEYBOARD'])? $params['KEYBOARD']: '',
				'ANSWER_URL' => $params['MESSAGE_URL']? $params['MESSAGE_URL']: '',
			));
			$result = Array('RESULT' => 'OK');
		}
		else if($command == "AnswerCommand")
		{
			self::sendAnswerCommand($params['MESSAGE_ID'], Array(
				'DIALOG_ID' => $params['DIALOG_ID'],
				'MESSAGE' => $params['MESSAGE'],
				'MESSAGE_ANSWER' => $params['MESSAGE_ANSWER'],
				'ATTACH' => isset($params['ATTACH'])? $params['ATTACH']: '',
				'KEYBOARD' => isset($params['KEYBOARD'])? $params['KEYBOARD']: '',
				'MESSAGE_ID' => $params['MESSAGE_ID']? intval($params['MESSAGE_ID']): 0,
				'COMMAND_ID' => $params['COMMAND_ID']? intval($params['COMMAND_ID']): 0,
				'COMMAND_CONTEXT' => $params['COMMAND_CONTEXT']? $params['COMMAND_CONTEXT']: 'TEXTAREA',
			));
			$result = Array('RESULT' => 'OK');
		}
		else
		{
			$result = new \Bitrix\ImBot\Error(__METHOD__, 'UNKNOWN_COMMAND', 'Command not found');
		}

		return $result;
	}

	public static function onAfterUserAuthorize($params)
	{
		return true;
	}

	public static function onAfterTmDayStart($params)
	{
		//$dateNow = new \Bitrix\Main\Type\DateTime();
		//if (self::getBotOption($params['USER_ID'], 'planner_message', 0) < $dateNow->format('Ymd'))
		//{
		//	\CAgent::AddAgent('\\Bitrix\\ImBot\\Bot\\Marta::addPlannerMessageAgent('.$params['USER_ID'].');', "imbot", "N", 60, "", "Y", \ConvertTimeStamp(time()+\CTimeZone::GetOffset()+60, "FULL"));
		//}
		self::notifyAboutPlans($params['USER_ID'], $params['USER_ID']);
	}

	public static function addPlannerMessageAgent($userId)
	{
		$userId = intval($userId);
		if ($userId <= 0)
			return "";

		self::notifyAboutPlans($userId, $userId);

		return "";
	}

	public static function addRenameMessageAgent($userId = null)
	{
		if (!\Bitrix\Main\Loader::includeModule('im') || !\Bitrix\Main\Loader::includeModule('bitrix24'))
			return "";

		if (\CBitrix24::isDomainChanged())
			return "";

		$language = null;
		$botData = \Bitrix\Im\Bot::getCache(self::getBotId());
		if ($botData['LANG'])
		{
			$language = $botData['LANG'];
			Loc::loadLanguageFile(__FILE__, $language);
		}

		$option = \Bitrix\Main\Config\Option::get(self::MODULE_ID, 'marta_rename_message', serialize(Array()));
		$messages = unserialize($option);

		$userId = intval($userId);
		if ($userId)
		{
			$users = Array($userId);
		}
		else
		{
			$users = \CBitrix24::getAllAdminId();
		}
		foreach ($users as $userId)
		{
			$messages[] = self::sendAnswer(0, Array(
				'DIALOG_ID' => $userId,
				'ANSWER' => Loc::getMessage('IMBOT_BOT_RENAME_TEXT', null, $language),
				'KEYBOARD' => Array(
					Array(
						"TEXT" => Loc::getMessage('IMBOT_BOT_RENAME_BUTTON_NOW', null, $language),
						"FUNCTION" => "BX.MessengerCommon.openRenamePortal(this);",
						"BG_COLOR" => "#e98fa6",
						"TEXT_COLOR" => "#FFF",
						"DISPLAY" => "LINE",
					),
					Array(
						"TEXT" => Loc::getMessage('IMBOT_BOT_RENAME_BUTTON_LATER', null, $language),
						"COMMAND" => "renamePortalLater",
						"DISPLAY" => "LINE",
					),
				)
			));
		}

		\Bitrix\Main\Config\Option::set(self::MODULE_ID, 'marta_rename_message', serialize($messages));

		RegisterModuleDependences("bitrix24", "OnDomainChange", self::MODULE_ID, __CLASS__, "onRenamePortalDomainChange");

		$commandId = \Bitrix\Main\Config\Option::get(self::MODULE_ID, 'marta_rename_command', 0);
		if ($commandId <= 0)
		{
			$commandId = \Bitrix\Im\Command::register(Array(
				'MODULE_ID' => self::MODULE_ID,
				'BOT_ID' => self::getBotId(),
				'COMMAND' => 'renamePortalLater',
				'HIDDEN' => 'Y',
				'CLASS' => __CLASS__,
				'METHOD_COMMAND_ADD' => 'onRenamePortalLaterCommand'
			));
			\Bitrix\Main\Config\Option::set(self::MODULE_ID, 'marta_rename_command', $commandId);
		}

		return "";
	}

	public static function onRenamePortalDomainChange($params)
	{
		if (!\Bitrix\Main\Loader::includeModule('im') || !\Bitrix\Main\Loader::includeModule('bitrix24'))
			return true;

		$language = null;
		$botData = \Bitrix\Im\Bot::getCache(self::getBotId());
		if ($botData['LANG'])
		{
			$language = $botData['LANG'];
			Loc::loadLanguageFile(__FILE__, $language);
		}

		$option = \Bitrix\Main\Config\Option::get(self::MODULE_ID, 'marta_rename_message', serialize(Array()));
		$messages = unserialize($option);
		foreach ($messages as $messageId)
		{
			\Bitrix\Im\Bot::updateMessage(Array('BOT_ID' => self::getBotId()), Array(
				'MESSAGE_ID' => $messageId,
				'KEYBOARD' => 'N',
			));
		}

		\Bitrix\Main\Config\Option::set(self::MODULE_ID, 'marta_rename_message', serialize(Array()));

		$newDomain = '[url=http://'.$params['new_domain'].']'.$params['new_domain'].'[/url]';

		$users = \CBitrix24::getAllAdminId();
		foreach ($users as $userId)
		{
			$messages[] = self::sendAnswer(0, Array(
				'DIALOG_ID' => $userId,
				'ANSWER' => Loc::getMessage('IMBOT_BOT_RENAME_DONE', Array('#NEW_DOMAIN#' => $newDomain), $language),
				'RICH' => 'N'
			));
		}

		UnRegisterModuleDependences("bitrix24", "OnDomainChange", self::MODULE_ID, __CLASS__, "onRenamePortalDomainChange");

		$commandId = \Bitrix\Main\Config\Option::get(self::MODULE_ID, 'marta_rename_command', 0);
		if ($commandId)
		{
			\Bitrix\Im\Command::unRegister(Array(
				'COMMAND_ID' => $commandId
			));
			\Bitrix\Main\Config\Option::set(self::MODULE_ID, 'marta_rename_command', 0);
		}

		return true;
	}

	public static function onRenamePortalLaterCommand($messageId, $messageFields)
	{
		if ($messageFields['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE)
  		    return false;

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

		if (\CBitrix24::isDomainChanged())
			return false;

		\Bitrix\Im\Bot::updateMessage(Array('BOT_ID' => self::getBotId()), Array(
			'MESSAGE_ID' => $messageId,
			'KEYBOARD' => 'N',
		));

		$language = null;
		$botData = \Bitrix\Im\Bot::getCache(self::getBotId());
		if ($botData['LANG'])
		{
			$language = $botData['LANG'];
			Loc::loadLanguageFile(__FILE__, $language);
		}

		$messages[] = self::sendAnswer(0, Array(
			'DIALOG_ID' => $messageFields['FROM_USER_ID'],
			'ANSWER' => Loc::getMessage('IMBOT_BOT_RENAME_LATER', null, $language),
		));

		\CAgent::AddAgent('\\Bitrix\\ImBot\\Bot\\Marta::addRenameMessageAgent('.$messageFields['FROM_USER_ID'].');', "imbot", "N", 86400*7, "", "Y", \ConvertTimeStamp(time()+\CTimeZone::GetOffset()+(86400*7), "FULL"));

		return true;
	}

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

		$userData = \Bitrix\Im\User::getInstance($userId);
		if (!$userData || $userData->isExtranet())
			return false;

		$dateNow = new \Bitrix\Main\Type\DateTime();
		if (self::getBotOption($userId, 'planner_message', 0) < $dateNow->format('Ymd'))
		{
			self::setBotOption($userId, 'planner_message', $dateNow->format('Ymd'));
		}
		else
		{
			return false;
		}

		$language = null;
		$botData = \Bitrix\Im\Bot::getCache(self::getBotId());
		if ($botData['LANG'])
		{
			$language = $botData['LANG'];
			Loc::loadLanguageFile(__FILE__, $language);
		}

		$welcomeMessage = '';

		$dateNow = new \Bitrix\Main\Type\DateTime();
		if (self::getBotOption($userId, 'last_message', 0) < $dateNow->format('Ymd'))
		{
			$welcomeMessage = self::getHelloMessage($userId, $language).' :) [br]';
		}

		$answer = '';
		$attaches = Array();
		if (\Bitrix\Main\Loader::includeModule('intranet') && \Bitrix\Main\Loader::includeModule('calendar'))
		{
        	$calendarUrl = \CCalendar::GetPathForCalendarEx($userId);
			$calendarEventUrl = $calendarUrl.((strpos($calendarUrl, "?") === false) ? '?' : '&').'EVENT_ID=';

			$attach = new \CIMMessageParamAttach(1, \CIMMessageParamAttach::CHAT);

			$events = \CCalendarEventHandlers::OnPlannerInit(Array(
				'FULL' => true,
				'USER_ID' => $userId
			));
			if (is_array($events['DATA']['EVENTS']))
			{
				foreach ($events['DATA']['EVENTS'] as $event)
				{
					if ($event['TIME_FROM'] == $event['TIME_TO'] && $event['TIME_FROM'] == '00:00')
					{
						$eventTimeFormatted = Loc::getMessage('IMBOT_BOT_MESSAGE_CALEND_4', null, $language);
					}
					else
					{
						$eventTimeFormatted = Loc::getMessage('IMBOT_BOT_MESSAGE_CALEND_3', Array('#TIME_1#' => $event['TIME_FROM'], '#TIME_2#' => $event['TIME_TO']), $language);
					}
					$attach->AddGrid(Array(
						Array(
							"VALUE" => $eventTimeFormatted,
							"LINK" => $calendarEventUrl.$event['ID'],
							"DISPLAY" => "LINE",
							"WIDTH" => 120,
						),
						Array(
							"VALUE" => $event['NAME'],
							"DISPLAY" => "LINE"
						),
					));
				}
			}
			if (!$attach->IsEmpty())
			{
				$answer .= Loc::getMessage('IMBOT_BOT_MESSAGE_CALEND_1_'.mt_rand(1, 4), null, $language);
				$attaches[] = $attach;
			}
		}

		if (\Bitrix\Main\Loader::includeModule('tasks'))
		{
			try
			{
				$tasksCounter = \CTaskListCtrl::getMainCounterForUser($userId);
				if ($tasksCounter > 0)
				{
					$tasksUrl = \CTaskCountersNotifier::getTasksListLink($userId);

					$pluralForm = \CTasksTools::getPluralForm($tasksCounter, true);
					if ($pluralForm !== false)
						$taskMessage = 'IMBOT_BOT_MESSAGE_TASKS_'.($pluralForm+1);
					else
						$taskMessage = 'IMBOT_BOT_MESSAGE_TASKS_2';

					$answer = $answer.Loc::getMessage($taskMessage, Array('#TASKS_COUNT#' => $tasksCounter, '#URL_START#' => '[URL='.$tasksUrl.']', '#URL_END#' => '[/URL]'), $language);
				}
			}
			catch (\Exception $e)
			{}
		}

		if ($answer)
		{
			$answer = $welcomeMessage.'[br]'.$answer;

			\Bitrix\Im\Bot::startWriting(Array('BOT_ID' => self::getBotId()), $dialogId);

			\Bitrix\Im\Bot::addMessage(Array('BOT_ID' => self::getBotId()), Array(
				'DIALOG_ID' => $dialogId,
				'MESSAGE' => $answer,
				'ATTACH' => $attaches,
				'URL_PREVIEW' => 'N'
			));
		}

		return true;
	}

	public static function getHelloMessage($userId, $language = null)
	{
		if (!\Bitrix\Main\Loader::includeModule('im'))
			return false;

		$userName = \Bitrix\Im\User::getInstance($userId)->getName(false);
		if (!$userName)
			return "";

		if ($language)
		{
			Loc::loadLanguageFile(__FILE__, $language);
		}

		$dateNow = new \Bitrix\Main\Type\DateTime();
		$dateNow->add(\CTimeZone::GetOffset().' SECOND');
		$hour = $dateNow->format('H');

		if ($hour >= 18 && $hour <= 23 || $hour >= 0 && $hour < 5)
		{
			$message = Loc::getMessage('IMBOT_BOT_MESSAGE_HELLO_EVENING', Array('#USER_NAME#' => $userName), $language);
		}
		else if ($hour >= 5 && $hour < 12)
		{
			$message = Loc::getMessage('IMBOT_BOT_MESSAGE_HELLO_MORNING', Array('#USER_NAME#' => $userName), $language);
		}
		else
		{
			$message = Loc::getMessage('IMBOT_BOT_MESSAGE_HELLO_DAY', Array('#USER_NAME#' => $userName), $language);
		}

		return $message;
	}

	public static function sendAnswer($messageId, $messageFields)
	{
		$attach = Array();
		if (!empty($messageFields['ATTACH']))
		{
			$attach = \CIMMessageParamAttach::GetAttachByJson($messageFields['ATTACH']);
		}

		$keyboard = Array();
		if (!empty($messageFields['KEYBOARD']))
		{
			$keyboard = Array('BOT_ID' => self::getBotId());
			if (!isset($messageFields['KEYBOARD']['BUTTONS']))
			{
				$keyboard['BUTTONS'] = $messageFields['KEYBOARD'];
			}
			else
			{
				$keyboard = $messageFields['KEYBOARD'];
			}
			$keyboard = \Bitrix\Im\Bot\Keyboard::getKeyboardByJson($keyboard, Array(), Array('ENABLE_FUNCTIONS' => 'Y'));
		}

		if ($messageFields['ANSWER_URL'])
		{
			$messageFields['ANSWER'] = ' '.$messageFields['ANSWER_URL'];
		}

		$messageId = \Bitrix\Im\Bot::addMessage(Array('BOT_ID' => self::getBotId()), Array(
			'DIALOG_ID' => $messageFields['DIALOG_ID'],
			'MESSAGE' => $messageFields['ANSWER'],
			'ATTACH' => $attach,
			'KEYBOARD' => $keyboard,
			'PARAMS' => isset($messageFields['PARAMS'])? $messageFields['PARAMS']: Array(),
			'URL_PREVIEW' => isset($messageFields['RICH'])? $messageFields['RICH']: "Y"
		));

		return $messageId;
	}

	public static function sendAnswerCommand($messageId, $messageFields)
	{
		$attach = Array();
		if (!empty($messageFields['ATTACH']))
		{
			$attach = \CIMMessageParamAttach::GetAttachByJson($messageFields['ATTACH']);
		}

		$keyboard = Array();
		if (!empty($messageFields['KEYBOARD']))
		{
			$keyboard = Array('BOT_ID' => self::getBotId());
			if (!isset($messageFields['KEYBOARD']['BUTTONS']))
			{
				$keyboard['BUTTONS'] = $messageFields['KEYBOARD'];
			}
			else
			{
				$keyboard = $messageFields['KEYBOARD'];
			}
			$keyboard = \Bitrix\Im\Bot\Keyboard::getKeyboardByJson($keyboard);
		}

		$messageParams = Array(
			'DIALOG_ID' => $messageFields['DIALOG_ID'],
			'MESSAGE' => $messageFields['MESSAGE_ANSWER'],
			'ATTACH' => $attach,
			'KEYBOARD' => $keyboard
		);

		if ($messageFields['COMMAND_ID'] > 0)
		{
			if ($messageFields['COMMAND_CONTEXT'] == 'KEYBOARD')
			{
				\CIMMessageParam::Set($messageFields['MESSAGE_ID'], Array('KEYBOARD' => $keyboard? $keyboard: 'N', 'ATTACH' => $attach? $attach: Array()));

				if (!empty($messageParams['MESSAGE']))
				{
					\CIMMessenger::Update($messageFields['MESSAGE_ID'], $messageParams['MESSAGE'], true, false, self::getBotId());
				}

				\CIMMessageParam::SendPull($messageFields['MESSAGE_ID'], Array('KEYBOARD', 'ATTACH'));
			}
			else
			{
				\Bitrix\Im\Command::addMessage(Array('MESSAGE_ID' => $messageFields['MESSAGE_ID'], 'COMMAND_ID' => $messageFields['COMMAND_ID']), $messageParams);
			}
		}
		else
		{
			\Bitrix\Im\Bot::addMessage(Array('BOT_ID' => self::getBotId()), $messageParams);
		}
	}

	private static function sendMessage($params)
	{
		$http = new \Bitrix\ImBot\Http(self::BOT_CODE);
		$query = $http->query(
			'SendMessage',
			$params
		);
		if (isset($query->error))
		{
			self::$lastError = new \Bitrix\ImBot\Error(__METHOD__, $query->error->code, $query->error->msg);
			return false;
		}

		return $query;
	}

	private static function sendCommand($params)
	{
		$http = new \Bitrix\ImBot\Http(self::BOT_CODE);
		$query = $http->query(
			'SendCommand',
			$params
		);
		if (isset($query->error))
		{
			self::$lastError = new \Bitrix\ImBot\Error(__METHOD__, $query->error->code, $query->error->msg);
			return false;
		}

		return $query;
	}

	public static function getLangMessage($messageCode = '')
	{
		$botData = \Bitrix\Im\Bot::getCache(self::getBotId());
		$language = null;
		if ($botData['LANG'])
		{
			$language = $botData['LANG'];
			Loc::loadLanguageFile(__FILE__, $language);
		}
		return Loc::getMessage($messageCode, null, $language);
	}

	public static function onAppLang($icon, $lang = null)
	{
		$title = Loc::getMessage('IMBOT_ICON_'.strtoupper($icon).'_TITLE', null, $lang);
		$description = Loc::getMessage('IMBOT_ICON_'.strtoupper($icon).'_DESCRIPTION', null, $lang);
		$copyright = '';

		$result = false;
		if (strlen($title) > 0)
		{
			$result = Array(
				'TITLE' => $title,
				'DESCRIPTION' => $description,
				'COPYRIGHT' => $copyright
			);
		}

		return $result;
	}

	public static function addWelcomeMessageAgent()
	{
		return "";
	}
}