Your IP : 3.148.232.123


Current Path : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/faceid/lib/
Upload File :
Current File : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/faceid/lib/users.php

<?php

namespace Bitrix\Faceid;

use Bitrix\Main;
use Bitrix\Main\Localization\Loc;

/**
 * Class UsersTable
 * Handles dedicated remote face gallery for identifying portal users
 * @package Bitrix\Faceid
 **/

class UsersTable extends Main\Entity\DataManager
{
	/**
	 * Returns DB table name for entity.
	 *
	 * @return string
	 */
	public static function getTableName()
	{
		return 'b_faceid_users';
	}

	/**
	 * Returns entity map definition.
	 *
	 * @return array
	 */
	public static function getMap()
	{
		return array(
			new Main\Entity\IntegerField('ID', array(
				'primary' => true,
				'autocomplete' => true
			)),
			new Main\Entity\IntegerField('FILE_ID'),
			new Main\Entity\IntegerField('CLOUD_FACE_ID'),
			new Main\Entity\IntegerField('USER_ID')
		);
	}

	/**
	 * Listener to the events main:OnAfterUserUpdate and main:OnBeforeUserAdd
	 *
	 *@param $arFields
	 */
	public static function onUserPhotoChange($arFields)
	{
		if (!empty($arFields['PERSONAL_PHOTO']))
		{
			// delete existing photo for this user
			$userFaces = static::getList(array('filter' => array('=USER_ID' => $arFields['ID'])))->fetchAll();
			if (!empty($userFaces))
			{
				foreach ($userFaces as $userFace)
				{
					// delete user's face
					static::deleteUserFace($userFace);
				}
			}

			// index new avatar
			static::indexUser($arFields);
		}
	}

	// main:OnBeforeUserUpdate
	public static function onUserPhotoDelete($arFields)
	{
		// check if need to delete photo
		if (!empty($arFields['PERSONAL_PHOTO']) && isset($arFields['PERSONAL_PHOTO']["del"]) && $arFields['PERSONAL_PHOTO']["del"] <> '')
		{
			// okay
			$userFaces = static::getList(array('filter' => array('=USER_ID' => $arFields['ID'])))->fetchAll();
			if (!empty($userFaces))
			{
				foreach ($userFaces as $userFace)
				{
					// delete user's face
					static::deleteUserFace($userFace);
				}
			}
		}
	}

	// main:OnAfterUserDelete
	public static function onUserDelete($userId)
	{
		$userFaces = static::getList(array('filter' => array('=USER_ID' => $userId)))->fetchAll();
		if (!empty($userFaces))
		{
			foreach ($userFaces as $userFace)
			{
				// delete user's face
				static::deleteUserFace($userFace);
			}
		}
	}

	public static function indexUser($user)
	{
		if (!static::checkTimemanEnabled($user['ID']))
		{
			return false;
		}

		// add new face
		$file = \CFile::MakeFileArray($user['PERSONAL_PHOTO']);
		$io = \CBXVirtualIo::GetInstance();

		// handle b24 remote files
		$filePath = $io->GetPhysicalName($file['tmp_name']);

		if ($file['type'] == 'image/jpeg')
		{
			$imageContent = $io->GetFile($filePath)->GetContents();
		}
		else
		{
			// convert non-jpeg formats to jpeg
			$fileSizeTmp = \CFile::GetImageSize($filePath, true);

			switch ($fileSizeTmp[2])
			{
				case IMAGETYPE_GIF:
					$sourceImage = imagecreatefromgif($filePath);
					break;
				case IMAGETYPE_PNG:
					$sourceImage = imagecreatefrompng($filePath);
					break;
				case IMAGETYPE_BMP:
					$sourceImage = \CFile::ImageCreateFromBMP($filePath);
					break;
				default:
					return false;
			}

			ob_start();
			imagejpeg($sourceImage, null, 95);
			$imageContent = ob_get_clean();
		}

		// duplicate image for face database
		$response = FaceId::addUser($imageContent, $user['ID']);

		if (!empty($response['success']) && !empty($response['result']['added']))
		{
			// everything's ok
			return true;
		}
		else
		{
			//'msg' => \Bitrix\FaceId\FaceId::getErrorMessage($response['result']['code'])
			return false;
		}
	}

	public static function indexUsers()
	{
		$result = Main\UserTable::getList(array(
			'select' => array('ID', 'PERSONAL_PHOTO'),
			'filter' => array('=ACTIVE' => 'Y', '>PERSONAL_PHOTO' => 0)
		));

		while ($user = $result->fetch())
		{
			static::indexUser($user);
		}
	}

	public static function reindexUsers()
	{
		$result = static::getList();
		while ($userFace = $result->fetch())
		{
			static::deleteUserFace($userFace);
		}

		static::indexUsers();
	}

	public static function deleteUserFace($userFace)
	{
		if (!Main\Config\Option::get('faceid', 'user_index_enabled', 0))
		{
			return false;
		}

		$response = FaceId::deleteUser($userFace);

		if ($response['success'] && !empty($response['result']['deleted']))
		{
			static::delete($userFace['ID']);
			\CFile::Delete($userFace['FILE_ID']);
		}
	}

	public static function checkTimemanEnabled($userId)
	{
		if (!Main\Config\Option::get('faceid', 'user_index_enabled', 0))
		{
			return false;
		}

		if (\Bitrix\Main\Loader::includeModule('timeman'))
		{
			$tmUser = new \CTimeManUser($userId);
			$settings = $tmUser->GetSettings(['UF_TIMEMAN']);
			return (bool)$settings['UF_TIMEMAN'];
		}

		return false;
	}

	public static function getExpiredReasonList()
	{
		Loc::loadMessages(__FILE__);

		return array(
			'forgot' => Loc::getMessage("FACEID_USERS_EXP_REASON_FORGOT"),
			'maintenance' => Loc::getMessage("FACEID_USERS_EXP_REASON_MAINTENANCE"),
			'other' => Loc::getMessage("FACEID_USERS_EXP_REASON_OTHER")
		);
	}
}