• Модуль: imbot
  • Путь к файлу: ~/bitrix/modules/imbot/lib/bot/network.php
  • Класс: BitrixImBotBotNetwork
  • Вызов: Network::operatorMessageAdd
static function operatorMessageAdd($messageId, $messageFields)
{
	if (!MainLoader::includeModule('im'))
	{
		return false;
	}

	if (!empty($messageFields['BOT_CODE']))
	{
		$list = ImBot::getListCache();
		foreach ($list as $botData)
		{
			if ($botData['TYPE'] != ImBot::TYPE_NETWORK)
			{
				continue;
			}

			if ($messageFields['BOT_CODE'] == $botData['APP_ID'])
			{
				$messageFields['BOT_ID'] = (int)$botData['BOT_ID'];
				break;
			}
		}
		if ((int)$messageFields['BOT_ID'] <= 0)
		{
			return false;
		}
	}

	$message = [
		'DIALOG_ID' => $messageFields['DIALOG_ID'],
		'MESSAGE' => $messageFields['MESSAGE'],
		'PARAMS' => [],
		'URL_PREVIEW' => 'Y',
	];

	if (!empty($messageFields['PARAMS']))
	{
		$message['PARAMS'] = $messageFields['PARAMS'];
	}

	if ($messageId > 0)
	{
		$message['PARAMS'][self::MESSAGE_PARAM_CONNECTOR_MID] = [$messageId];
	}

	if (!empty($messageFields['KEYBOARD']))
	{
		$message['KEYBOARD'] = self::processIncomingKeyboard($messageFields);
	}

	if (!empty($messageFields['ATTACH']))
	{
		$message['ATTACH'] = CIMMessageParamAttach::getAttachByJson($messageFields['ATTACH']);
	}

	if (!empty($messageFields['FILES']))
	{
		if (!($message['ATTACH'] instanceof CIMMessageParamAttach))
		{
			$message['ATTACH'] = new CIMMessageParamAttach(null, CIMMessageParamAttach::CHAT);
		}
		foreach ($messageFields['FILES'] as $value)
		{
			if ($value['type'] === 'image')
			{
				$message['ATTACH']->addImages([[
					'NAME' => $value['name'],
					'LINK' => $value['link'],
					'WIDTH' => (int)$value['width'],
					'HEIGHT' => (int)$value['height'],
				]]);
			}
			else
			{
				$message['ATTACH']->addFiles([[
					'NAME' => $value['name'],
					'LINK' => $value['link'],
					'SIZE' => $value['size'],
				]]);
			}
		}
	}

	// url preview
	if (isset($messageFields['URL_PREVIEW']) && $messageFields['URL_PREVIEW'] === 'N')
	{
		$message['URL_PREVIEW'] = 'N';
	}

	// system
	if (
		isset($messageFields['PARAMS'], $messageFields['PARAMS']['CLASS'])
		&& $messageFields['PARAMS']['CLASS'] === 'bx-messenger-content-item-ol-output'
	)
	{
		$message['URL_PREVIEW'] = 'N';
	}

	if (!empty($messageFields['USER']))
	{
		$message['PARAMS']['USER_ID'] = $messageFields['USER']['ID'];
		$nameTemplateSite = CSite::getNameFormat(false);
		$userName = CUser::formatName($nameTemplateSite, $messageFields['USER'], true, false);
		if ($userName)
		{
			$message['PARAMS']['NAME'] = $userName;
		}
		$userAvatar = ImUser::uploadAvatar($messageFields['USER']['PERSONAL_PHOTO'], $messageFields['BOT_ID']);
		if ($userAvatar)
		{
			$message['PARAMS']['AVATAR'] = $userAvatar;
		}
	}

	// Update bot fields (name, desc, avatar, welcome mess) using data from incoming message
	if (!empty($messageFields['LINE']))
	{
		$needUpdateBotFields = true;
		$needUpdateBotAvatar = true;

		$bot = ImBot::getCache($messageFields['BOT_ID']);
		if ($bot['MODULE_ID'] && MainLoader::includeModule($bot['MODULE_ID']) && class_exists($bot["CLASS"]))
		{
			if (method_exists($bot["CLASS"], 'isNeedUpdateBotFieldsAfterNewMessage'))
			{
				$needUpdateBotFields = call_user_func_array([$bot["CLASS"], 'isNeedUpdateBotFieldsAfterNewMessage'], []);
			}
			if (method_exists($bot["CLASS"], 'isNeedUpdateBotAvatarAfterNewMessage'))
			{
				$needUpdateBotAvatar = call_user_func_array([$bot["CLASS"], 'isNeedUpdateBotAvatarAfterNewMessage'], []);
			}
		}
		if ($needUpdateBotFields || $needUpdateBotAvatar)
		{
			$botData = ImUser::getInstance($messageFields['BOT_ID']);

			if ($needUpdateBotFields)
			{
				$updateFields = [];
				if ($messageFields['LINE']['NAME'] != htmlspecialcharsback($botData->getName()))
				{
					$updateFields['NAME'] = $messageFields['LINE']['NAME'];
				}
				if ($messageFields['LINE']['DESC'] != htmlspecialcharsback($botData->getWorkPosition()))
				{
					$updateFields['WORK_POSITION'] = $messageFields['LINE']['DESC'];
				}
				if ($messageFields['LINE']['WELCOME_MESSAGE'] != $bot['TEXT_PRIVATE_WELCOME_MESSAGE'])
				{
					ImBot::update(['BOT_ID' => $messageFields['BOT_ID']], [
						'TEXT_PRIVATE_WELCOME_MESSAGE' => $messageFields['LINE']['WELCOME_MESSAGE']
					]);
				}
				if (!empty($updateFields))
				{
					self::getCurrentUser()->update($messageFields['BOT_ID'], $updateFields);
				}
			}

			if ($needUpdateBotAvatar && !empty($messageFields['LINE']['AVATAR']))
			{
				$botAvatar = ImUser::uploadAvatar($messageFields['LINE']['AVATAR'], $messageFields['BOT_ID']);
				if ($botAvatar && $botData->getAvatarId() != $botAvatar)
				{
					$connection = MainApplication::getConnection();
					$connection->query("UPDATE b_user SET PERSONAL_PHOTO = ".(int)$botAvatar." WHERE ID = ".(int)$messageFields['BOT_ID']);
				}
			}

		}
	}

	$connectorMid = ImBot::addMessage(['BOT_ID' => $messageFields['BOT_ID']], $message);

	if ($messageId > 0)
	{
		self::clientMessageReceived([
			'BOT_ID' => $messageFields['BOT_ID'],
			'DIALOG_ID' => $messageFields['DIALOG_ID'],
			'MESSAGE_ID' => $messageId,
			'CONNECTOR_MID' => $connectorMid,
		]);
	}

	return true;
}