Как сменить владельца чата в коробочной версии Битрикс24

Один из главных способов коммуникации сотрудников внутри портала Битрикс24 — это чаты. Чаты могут быть как между двумя сотрудниками и носить характер диалога, так групповыми, в которых могут принимать участие целый ряд сотрудников. Останавливаться на разновидностях чатов, механизме их создания мы сегодня не будем. Сегодня немного о другом.

У каждого группового чата есть владелец. Он же — модератор. Это сотрудник компании, который создал данный чат. Он обладает пожалуй, что одним, но достаточно важным преимуществом над остальными участниками — это возможность исключать сотрудников из чата. К слову, мне не совсем понятно, чем руководствовались разработчики, оставляя возможность «рядовым» участникам менять название и иконку, а также приглашать в закрытый чат новых сотрудников. Но как гласить народная мудрость: «Жираф — большой, а компании 1С-Битрикс — виднее».

Рано или поздно, но может возникнуть потребность в замене модератора. Причин для этого может быть масса: сотрудник уволен, находится в длительной командировке или отпуске. И здесь вас ожидает неприятный сюрприз. При всем своем широком функционале Битрикс24 не имеет штатного механизма смены модератора чата. Решений здесь может быть несколько:

  • оставляем все как есть и ничего не делаем
  • реализуем механизм с помощью REST API
  • воспользуемся встроенными функциями и методами коробочного Б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 'В процессе выполнения скрипта возникла ошибка. ';
     }
}

Действующие ограничения

Их немного, но они есть:

  • убедитесь, что пользователь, которому передаются права, присутствует в чате
  • скрипт должен выполняться от имени пользователя, присутствующего в чате

Если эти условия не соблюдены — скрипт работать не будет. Кроме того, я не проверял его работоспособность без полных прав. Такие скрипты по определению должны быть закрыты для рядовых пользователей правами доступа.

Вот в общем-то и все. Уверен, что данный механизм будет полезен для вас!

Опубликовано: 13 февраля 2020 года, в рубрике «Битрикс».

2
Оставить комментарий

5000
  Подписаться  
сначала новые сначала старые
Уведомление о
Анатолий

А можно просто сделать 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) / перезапустить десктопное приложение (видимо информацию о чатах приложение получает только при запуске).

Поблагодарить автора статьи
Зачем это нужно