Один из главных способов коммуникации сотрудников внутри портала Битрикс24 — это чаты. Чаты могут быть как между двумя сотрудниками и носить характер диалога, так групповыми, в которых могут принимать участие целый ряд сотрудников. Останавливаться на разновидностях чатов, механизме их создания мы сегодня не будем. Сегодня немного о другом.
У каждого группового чата есть владелец. Он же — модератор. Это сотрудник компании, который создал данный чат. Он обладает пожалуй, что одним, но достаточно важным преимуществом над остальными участниками — это возможность исключать сотрудников из чата. К слову, мне не совсем понятно, чем руководствовались разработчики, оставляя возможность «рядовым» участникам менять название и иконку, а также приглашать в закрытый чат новых сотрудников. Но как гласить народная мудрость: «Жираф — большой, а компании 1С-Битрикс — виднее».
Рано или поздно, но может возникнуть потребность в замене модератора. Причин для этого может быть масса: сотрудник уволен, находится в длительной командировке или отпуске. И здесь вас ожидает неприятный сюрприз. При всем своем широком функционале Битрикс24 не имеет штатного механизма смены модератора чата. Решений здесь может быть несколько:
Первое решение мне импонирует больше остальных. Второе — не импонирует совсем, но скорее всего подойдет если вы пользуетесь облачной версией Битрикс24. Если кратко, то у Б24 существует бот-платформа, работающая на базе REST API, в которую входит целый ряд методов по работе с мессенджером. Один из них — im.chat.setOwner
, который как раз и решает поставленную задачу. Подробнее смотрите в официальной документации. И, наконец, третий вариант. Это решение нравится с технической точки зрения и именно его мы будем использовать.
Нам понадобится метод CIMChat::SetOwner
. Исходный код выглядит следующим образом:
// /bitrix/modules/im/classes/general/im_chat.php:1806 public function SetOwner($chatId, $userId, $checkPermission = true) { $chatId = intval($chatId); $userId = intval($userId); $chat = IM\Model\ChatTable::getById($chatId)->fetch(); if (!$chat) return false; if ($checkPermission && $chat['AUTHOR_ID'] != $this->user_id) return false; if ($userId == $chat['AUTHOR_ID']) return true; $arRelation = self::GetRelationById($chatId); if (!isset($arRelation[$userId])) return false; IM\Model\ChatTable::update($chatId, Array('AUTHOR_ID' => $userId)); IM\Model\RelationTable::update($arRelation[$userId]['ID'], Array('MANAGER' => 'Y')); if (isset($arRelation[$chat['AUTHOR_ID']])) { IM\Model\RelationTable::update($arRelation[$chat['AUTHOR_ID']]['ID'], Array('MANAGER' => 'N')); } if (CModule::IncludeModule('pull')) { \Bitrix\Pull\Event::add(array_keys($arRelation), Array( 'module_id' => 'im', 'command' => 'chatOwner', 'params' => Array( 'dialogId' => 'chat'.$chatId, 'chatId' => $chatId, 'userId' => $userId ), 'extra' => \Bitrix\Im\Common::getPullExtra() )); } return true; }
Функция принимает 3 значения:
$chatId
— уникальный идентификатор чата$userId
— идентификатор нового владельца чата$checkPermission
— проверка прав. передаем false чтобы выполнять операцию мог не только модератор чатаЕсли с получением ID пользователя у нас не возникает проблем (указан в ссылке на карточку сотрудника), то с идентификатором чата сложнее.
Первый способ. Откройте окно чата, в режиме просмотра исходного кода выполните поиск по запросу CHAT_ID. В ряде случаев этот способ будем крайне полезен, но есть альтернатива.
Второй способ. Более простой и в данном контексте — правильный. Отправьте служебную команду /getChatId в диалоговое окно чата. Результат будет следующим:
С получением ID чата разобрались. Собираем рабочий скрипт.
В итоге наш скрипт будет представлять из себя форму с двумя полями и одной кнопкой. Создадим форму:
<form method="post" action="?change_chat_owner=YES"> <div class="form-control"> <div class="form-group"> <label>ID чата</label> <input type="text" class="form-control" id="chatId" name="chatId"> </div> <div class="form-group"> <label>ID нового владельца</label> <input type="text" class="form-control" id="userId" name="userId"> </div> </div> <button type="submit" id="send" name="send" class="btn btn-primary">Сменить владельца чата</button> </form>
В обработчике учтем необходимость отправки уведомления о смене модератора в чат.
Код будет следующим:
if (CModule::IncludeModule('im')) { $chatId = $_POST['chatId']; $userId = $_POST['userId']; $checkPermission = false; $change = CIMChat::SetOwner($chatId, $userId, $checkPermission); if ($change == 1) { /*отправляем уведомление*/ $ar = Array( "TO_CHAT_ID" => $chatId, // ID чата "SYSTEM" => Y, "MESSAGE" => "Администратор изменил владельца чата." ); CIMChat::AddMessage($ar); echo 'Владелец чата успешно изменен!'; } else { echo 'В процессе выполнения скрипта возникла ошибка. '; } }
Их немного, но они есть:
Если эти условия не соблюдены — скрипт работать не будет. Кроме того, я не проверял его работоспособность без полных прав. Такие скрипты по определению должны быть закрыты для рядовых пользователей правами доступа.
Вот в общем-то и все. Уверен, что данный механизм будет полезен для вас!
А можно просто сделать SQL запрос даже через админку Битрикса
UPDATE b_im_chat SET AUTHOR_ID=user-id WHERE ID=chat-id
Выработал следующую схему:
1) Добавляем нужного Пользователя в чат;
2) Получаем ID чата указав «/getDialogId» (без кавычек);
3) Заходим в административную часть: Настройки / Производительность / Таблицы / в фильтре находим нужный чат по ID чата (п.2) / нажимаем на ≡ (тройное равно) / Изменить / AUTHOR_ID присваиваем ID пользователя (п.1) / Сохранить;
4) Там же нажимаем на значение ID в чате / отобразиться список участников / нужно изменить старого владельца (указав в поле MANAGER значение N) и изменить нового владельца (указав в поле MANAGER значение Y) / перезапустить десктопное приложение (видимо информацию о чатах приложение получает только при запуске).
Не находи ничего в фильтре в таблицах. Пишу номер ID и пусто.
В админке есть Командная PHP-строка,
Пишем:
CModule::IncludeModule ('im');
$CIMChat = new CIMChat (1);
echo $CIMChat->SetOwner ([ID чата], [ID Нового владельца], false);