Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
Алексей Пикуров
Задача: на одном физическом сервере чата работает несколько разных компаний. Группа администраторов обслуживает их. Пользователи не должны видеть людей из соседних компаний.

1. Формируем общий список контактов, убираем доступ к нему у всех групп прав, кроме администраторов и директора. В общем списке контактов есть все зарегистрированные пользователи. Удобно для руководства компании и админов.

2. Создаём группы пользователей на сервере, раздел "Пользователи", "Группы пользователей", по названиям компаний. Раскидываем туда пользователей.

3. Делаем на сервере автосоздаваемые конференции, по компаниям. Включаем туда уже созданные группы пользователей. Конференции скрытые, чтобы люди не могли свободно переходить и даже видеть эти конференции.

4. Выполняем скрипт для автоматического формирования личных контактов для удобной навигации людей в этих компаниях, чтобы можно было позвонить или написать человеку, которого нет онлайн. Скрипт выполняем по необходимости, вручную, либо навешиваем для выполнения раз в сутки, например.

Текст скрипта:

Код: Выделить всё
// ---------------------------------------
// Script created by Alexey Pikurov (support@nsoft-s.com)
// 15.09.2019 17:15:30
// ---------------------------------------
// Список групп, разделённых символом "|".
// Это названия компаний, работающих на нашем сервере,
// для которых надо сформировать личные списки контактов
const
  GROUPS = 'IceCream Inc.' + '|' +
           'FixIt Software';
var
  sGroups, sCurrentGroup, sUINS, sBackup, s: string;
  iUINOwner, iUIN: integer;
begin
  sGroups := GROUPS;
 
    while length(sGroups) > 0 do begin
      sCurrentGroup := Fetch(sGroups, '|');
      sUINS   := mGetUsersListInGroupsByNames(sCurrentGroup); // получаем список пользователей группы
      sBackup := sUINS; // делаем резервную копию для цикла ниже
     
        while length(sUINS) > 0 do begin // перебираем пользователей группы
          iUINOwner := StrToInt(Fetch(sUINS, ','));
          mPersonalContactsClear(iUINOwner); // удаляем личный список контактов человека
          s := sBackup;
           
            while length(s) > 0 do begin // формируем ему новый личный список контактов
              iUIN := StrToInt(Fetch(s, ','));
             
                // если UIN человека не равен нашему собственному - добавляем его в список,
                // название группы - название компании, в которой работает человек
                if iUIN <> iUINOwner then mPersonalContactsAddUser(iUINOwner, iUIN, sCurrentGroup);
            end;
           
            // если пользователь онлайн - обновляем его личный список контактов
            if mIsUINOnline(iUINOwner) then mPersonalContactsRefresh(iUINOwner);
        end;
    end;
end.

Как это выглядит на клиенте после выполнения скрипта:

how-to-make-auto-contacts-list.png
Автоматическое формирование личного списка контактов в мессенджере MyChat
how-to-make-auto-contacts-list.png (15.9 КБ) Просмотров: 400

Скрипт будет работать в новой версии MyChat, после 7.7.