1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
workgroup.php
См. документацию.
1<?php
8namespace Bitrix\Socialnetwork\Integration\Im\Chat;
9
10use Bitrix\Im\Model\ChatTable;
11use Bitrix\Main\Entity\Query;
12use Bitrix\Main\Localization\Loc;
13use Bitrix\Main\Config\Option;
14use Bitrix\Main\Loader;
15use Bitrix\Socialnetwork\Integration\Im\ChatFactory;
16use Bitrix\Socialnetwork\Internals\Registry\GroupRegistry;
17use Bitrix\Socialnetwork\Item;
18use Bitrix\Socialnetwork\Provider\GroupProvider;
19use Bitrix\Socialnetwork\UserToGroupTable;
20
21Loc::loadMessages(__FILE__);
22
24{
25 const CHAT_ENTITY_TYPE = "SONET_GROUP";
26 private static $staticCache = array();
27
28 public static function getUseChat(): bool
29 {
30 return Option::get('socialnetwork', 'use_workgroup_chat', "Y") === "Y";
31 }
32
33 public static function getChatData($params)
34 {
35 $result = array();
36
37 if (
39 || !isset($params['group_id'])
40 || !Loader::includeModule('im')
41 )
42 {
43 return $result;
44 }
45
46 if (!is_array($params['group_id']))
47 {
48 $params['group_id'] = array($params['group_id']);
49 }
50
51 $cacheKey = serialize($params);
52 if (isset(self::$staticCache[$cacheKey]))
53 {
54 return self::$staticCache[$cacheKey];
55 }
56
57 $params['group_id'] = array_values(array_unique(array_filter(array_map(
58 function($groupId) {
59 return (is_array($groupId) || intval($groupId) <= 0 ? false : intval($groupId));
60 },
61 $params['group_id']
62 ))));
63
64
65 $groupIds = $params['group_id'];
66
67 if (!static::getUseChat())
68 {
69 $provider = GroupProvider::getInstance();
70 $provider->loadGroupTypes(...$groupIds);
71
72 $groupIds = array_filter(
73 $groupIds,
74 static fn (int $groupId): bool => $provider->getGroupType($groupId) === Item\Workgroup\Type::Collab
75 );
76 }
77
78 if (empty($groupIds))
79 {
80 return $result;
81 }
82
83 if (
84 !isset($params['skipAvailabilityCheck'])
85 || !$params['skipAvailabilityCheck']
86 )
87 {
88 foreach($groupIds as $key => $value)
89 {
90 if (!self::getGroupChatAvailable($value))
91 {
92 unset($groupIds[$key]);
93 }
94 }
95 }
96
97 $res = ChatTable::getList(array(
98 'select' => Array('ID', 'ENTITY_ID'),
99 'filter' => array(
100 '=ENTITY_TYPE' => self::CHAT_ENTITY_TYPE,
101 '@ENTITY_ID' => $groupIds
102 )
103 ));
104 while ($chat = $res->fetch())
105 {
106 $result[$chat['ENTITY_ID']] = $chat['ID'];
107 }
108
109 self::$staticCache[$cacheKey] = $result;
110
111 return $result;
112 }
113
114 public static function getGroupChatAvailable($groupId = false)
115 {
116 $result = false;
117
118 if (intval($groupId) <= 0)
119 {
120 return $result;
121 }
122
123 $groupType = GroupProvider::getInstance()->getGroupType($groupId);
124 if ($groupType === Item\Workgroup\Type::Collab)
125 {
126 return true;
127 }
128
129 $activeFeatures = \CSocNetFeatures::getActiveFeatures(SONET_ENTITY_GROUP, $groupId);
130 if (
131 is_array($activeFeatures)
132 && in_array('chat', $activeFeatures)
133 )
134 {
135 $result = true;
136 }
137
138 return $result;
139 }
140
141 public static function createChat($params)
142 {
143 $groupId = (int)($params['group_id'] ?? 0);
144 if ($groupId <= 0)
145 {
146 return false;
147 }
148
149 if (!Loader::includeModule('im'))
150 {
151 return false;
152 }
153
154 $group = GroupRegistry::getInstance()->get($groupId);
155 if ($group === null)
156 {
157 return false;
158 }
159
160 if (!$group->isCollab() && !static::getUseChat())
161 {
162 return false;
163 }
164
166
167 if ($result->isSuccess())
168 {
169 static::$staticCache = [];
170 }
171
172 return $result->isSuccess();
173 }
174
175 public static function buildChatName($groupName, $params = []): string
176 {
177 $isProject = (bool)($params['project'] ?? false);
178 if ($isProject) // compatibility
179 {
180 $type = Item\Workgroup\Type::Project;
181 }
182 else
183 {
184 $type = Item\Workgroup\Type::tryFrom((string)($params['type'] ?? ''));
185 }
186
187 return ChatFactory::getChatTitle((string)$groupName, $type);
188 }
189
190 public static function setChatManagers($params)
191 {
192 if (
193 !array($params)
194 || !isset($params['group_id'])
195 || intval($params['group_id']) <= 0
196 || !isset($params['user_id'])
197 || !Loader::includeModule('im')
198 )
199 {
200 return false;
201 }
202
203 $userIdList = (is_array($params['user_id']) ? $params['user_id'] : array($params['user_id']));
204 $groupId = intval($params['group_id']);
205 $setFlag = (isset($params['set']) && $params['set']);
206
207 $groupType = GroupProvider::getInstance()->getGroupType($groupId);
208
209 if ($groupType !== Item\Workgroup\Type::Collab && !static::getUseChat())
210 {
211 return false;
212 }
213
214 $chatData = self::getChatData(array(
215 'group_id' => $groupId
216 ));
217
218 if (
219 empty($chatData)
220 || empty($chatData[$groupId])
221 || intval($chatData[$groupId]) <= 0
222 )
223 {
224 return false;
225 }
226
227 $chatId = $chatData[$groupId];
228
229 $chat = new \CIMChat();
230
231 $managersInfo = array();
232 foreach($userIdList as $userId)
233 {
234 $managersInfo[$userId] = $setFlag;
235 }
236
237 return $chat->setManagers($chatId, $managersInfo, false);
238 }
239
240 public static function unlinkChat($params)
241 {
242 if (
243 !array($params)
244 || !isset($params['group_id'])
245 || intval($params['group_id']) <= 0
246 || !self::getUseChat()
247 || !Loader::includeModule('im')
248 )
249 {
250 return false;
251 }
252
253 $groupId = (int)$params['group_id'];
254
255 $groupType = GroupProvider::getInstance()->getGroupType($groupId);
256 if ($groupType === Item\Workgroup\Type::Collab)
257 {
258 return false;
259 }
260
261 $groupName = ($params['group_name'] ?? null);
262 $isProject = ($params['group_project'] ?? null);
263
264 if ($groupName === null || $isProject === null)
265 {
266 $queryObject = \Bitrix\Socialnetwork\WorkgroupTable::getList([
267 'filter' => ['ID' => $groupId],
268 'select' => ['NAME', 'PROJECT'],
269 ]);
270 $groupFields = $queryObject->fetch();
271 $groupName = ($groupFields ? $groupFields['NAME'] : '');
272 $isProject = $groupFields['PROJECT'] === 'Y';
273 }
274
275 if ($groupName === '')
276 {
277 return false;
278 }
279
280 $chatMessageFields = array(
281 "MESSAGE" => str_replace(
282 '#GROUP_NAME#',
283 $groupName,
284 Loc::getMessage(
285 (
286 $isProject
287 ? "SOCIALNETWORK_WORKGROUP_CHAT_UNLINKED_PROJECT"
288 : "SOCIALNETWORK_WORKGROUP_CHAT_UNLINKED"
289 )
290 )
291 ),
292 "SYSTEM" => "Y"
293 );
294
295 $res = ChatTable::getList(array(
296 'select' => Array('ID'),
297 'filter' => array(
298 '=ENTITY_TYPE' => self::CHAT_ENTITY_TYPE,
299 '=ENTITY_ID' => $groupId
300 )
301 ));
302 while ($chat = $res->fetch())
303 {
304 if (ChatTable::update($chat['ID'], array(
305 'ENTITY_TYPE' => false,
306 'ENTITY_ID' => false
307 ))->isSuccess())
308 {
309 return \CIMChat::addMessage(array_merge(
310 $chatMessageFields, array(
311 "TO_CHAT_ID" => $chat['ID']
312 )
313 ));
314 }
315 }
316
317 return true;
318 }
319
329 public static function getNumberOfMembers(int $groupId): int
330 {
331 $query = new Query(UserToGroupTable::getEntity());
332
333 $records = $query
334 ->setSelect([
335 'USER_ID',
336 ])
337 ->where('GROUP_ID', $groupId)
338 ->countTotal(true)
339 ->exec()
340 ;
341
342 return $records->getCount();
343 }
344}
345?>
$type
Определения options.php:106
if(!Loader::includeModule('messageservice')) $provider
Определения callback_ednaruimhpx.php:21
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getGroupChatAvailable($groupId=false)
Определения workgroup.php:114
static getNumberOfMembers(int $groupId)
Определения workgroup.php:329
static buildChatName($groupName, $params=[])
Определения workgroup.php:175
static createChat(Workgroup $group)
Определения chatfactory.php:22
static getChatTitle(string $groupTitle, ?Type $groupType)
Определения chatfactory.php:49
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
$query
Определения get_search.php:11
Определения chain.php:3
if(empty($signedUserToken)) $key
Определения quickway.php:257
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
const SONET_ENTITY_GROUP
Определения include.php:117