%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/socialnetwork/lib/integration/im/chat/ |
Current File : //home/bitrix/www/bitrix/modules/socialnetwork/lib/integration/im/chat/workgroup.php |
<?php /** * Bitrix Framework * @package bitrix * @subpackage socialnetwork * @copyright 2001-2017 Bitrix */ namespace Bitrix\Socialnetwork\Integration\Im\Chat; use Bitrix\Im\Model\ChatTable; use Bitrix\Main\Localization\Loc; use Bitrix\Main\Config\Option; use Bitrix\Main\Loader; use Bitrix\Socialnetwork\Item; use Bitrix\Socialnetwork\UserToGroupTable; Loc::loadMessages(__FILE__); class Workgroup { const CHAT_ENTITY_TYPE = "SONET_GROUP"; private static $staticCache = array(); public static function getUseChat() { return (Option::get('socialnetwork', 'use_workgroup_chat', "Y") == "Y"); } public static function getChatData($params) { $result = array(); if ( !array($params) || !isset($params['group_id']) || !self::getUseChat() || !Loader::includeModule('im') ) { return $result; } if (!is_array($params['group_id'])) { $params['group_id'] = array($params['group_id']); } $cacheKey = serialize($params); if (isset(self::$staticCache[$cacheKey])) { return self::$staticCache[$cacheKey]; } $params['group_id'] = array_values(array_unique(array_filter(array_map( function($groupId) { return (is_array($groupId) || intval($groupId) <= 0 ? false : intval($groupId)); }, $params['group_id'] )))); if ( !isset($params['skipAvailabilityCheck']) || !$params['skipAvailabilityCheck'] ) { foreach($params['group_id'] as $key => $value) { if (!self::getGroupChatAvailable($value)) { unset($params['group_id'][$key]); } } } $res = ChatTable::getList(array( 'select' => Array('ID', 'ENTITY_ID'), 'filter' => array( '=ENTITY_TYPE' => self::CHAT_ENTITY_TYPE, '@ENTITY_ID' => $params['group_id'] ) )); while ($chat = $res->fetch()) { $result[$chat['ENTITY_ID']] = $chat['ID']; } self::$staticCache[$cacheKey] = $result; return $result; } public static function getGroupChatAvailable($groupId = false) { $result = false; if (intval($groupId) <= 0) { return $result; } $activeFeatures = \CSocNetFeatures::getActiveFeatures(SONET_ENTITY_GROUP, $groupId); if ( is_array($activeFeatures) && in_array('chat', $activeFeatures) ) { $result = true; } return $result; } public static function createChat($params) { $result = false; if ( !array($params) || !isset($params['group_id']) || intval($params['group_id']) <= 0 || !self::getUseChat() || !Loader::includeModule('im') ) { return $result; } $groupItem = Item\Workgroup::getById($params['group_id']); if (!$groupItem) { return $result; } $groupFields = $groupItem->getFields(); $project = $groupItem->isProject(); $userIdList = array(); $res = UserToGroupTable::getList(array( 'filter' => array( 'GROUP_ID' => $params['group_id'], '@ROLE' => UserToGroupTable::getRolesMember() ), 'select' => array('USER_ID') )); while($relation = $res->fetch()) { $userIdList[] = intval($relation['USER_ID']); } if (empty($userIdList)) { $userIdList = array($groupFields['OWNER_ID']); } $chatFields = array( 'TITLE' => self::buildChatName($groupFields['NAME'], array( 'project' => $project )), 'TYPE' => IM_MESSAGE_CHAT, 'ENTITY_TYPE' => self::CHAT_ENTITY_TYPE, 'ENTITY_ID' => intval($params['group_id']), 'SKIP_ADD_MESSAGE' => 'Y', 'AUTHOR_ID' => $groupFields['OWNER_ID'], 'USERS' => $userIdList ); $groupItem = Item\Workgroup::getById($params['group_id'], false); if ($groupItem) { $groupFields = $groupItem->getFields(); if (!empty($groupFields['IMAGE_ID'])) { $chatFields['AVATAR_ID'] = $groupFields['IMAGE_ID']; } } $chat = new \CIMChat(0); $result = $chat->add($chatFields); if ($result) { self::$staticCache = array(); } return $result; } public static function buildChatName($groupName, $params = array()) { $project = ( is_array($params) && isset($params['project']) && $params['project'] ); return Loc::getMessage(($project ? "SOCIALNETWORK_WORKGROUP_CHAT_TITLE_PROJECT" : "SOCIALNETWORK_WORKGROUP_CHAT_TITLE"), array( "#GROUP_NAME#" => $groupName )); } public static function setChatManagers($params) { $result = false; if ( !array($params) || !isset($params['group_id']) || intval($params['group_id']) <= 0 || !isset($params['user_id']) || !self::getUseChat() || !Loader::includeModule('im') ) { return $result; } $userIdList = (is_array($params['user_id']) ? $params['user_id'] : array($params['user_id'])); $groupId = intval($params['group_id']); $setFlag = (isset($params['set']) && $params['set']); $chatData = self::getChatData(array( 'group_id' => $groupId )); if ( empty($chatData) || empty($chatData[$groupId]) || intval($chatData[$groupId]) <= 0 ) { return $result; } $chatId = $chatData[$groupId]; $chat = new \CIMChat(); $managersInfo = array(); foreach($userIdList as $userId) { $managersInfo[$userId] = $setFlag; } return $chat->setManagers($chatId, $managersInfo, false); } public static function unlinkChat($params) { $result = false; if ( !array($params) || !isset($params['group_id']) || intval($params['group_id']) <= 0 || !self::getUseChat() || !Loader::includeModule('im') ) { return $result; } $groupItem = Item\Workgroup::getById($params['group_id']); if (!$groupItem) { return $result; } $groupFields = $groupItem->getFields(); $chatMessageFields = array( "MESSAGE" => str_replace('#GROUP_NAME#', $groupFields['NAME'], Loc::getMessage($groupItem->isProject() ? "SOCIALNETWORK_WORKGROUP_CHAT_UNLINKED_PROJECT" : "SOCIALNETWORK_WORKGROUP_CHAT_UNLINKED")), "SYSTEM" => "Y" ); $res = ChatTable::getList(array( 'select' => Array('ID'), 'filter' => array( '=ENTITY_TYPE' => self::CHAT_ENTITY_TYPE, '=ENTITY_ID' => $params['group_id'] ) )); while ($chat = $res->fetch()) { if (ChatTable::update($chat['ID'], array( 'ENTITY_TYPE' => false, 'ENTITY_ID' => false ))) { return \CIMChat::addMessage(array_merge( $chatMessageFields, array( "TO_CHAT_ID" => $chat['ID'] ) )); } } $result = true; return $result; } } ?>