Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
Алексей Пикуров
В константах перечисляете названия конференций, в которых включено ограничение, и группы прав, кому разрешено писать в эти конференции. Все остальные — блокируются. В консоль MyChat Client пользователя пишется уведомление, опционально.

Скрипт "навешивается" на событие OnConfMessage:

OnlyAdvUsersMsgScript.png
Скрипт блокировки сообщений в каналах MyChat
OnlyAdvUsersMsgScript.png (78.06 КБ) Просмотров: 2601

OnlyAdvUsersMsgScriptResult.png
Результат работы скрипта, который запретил отправку сообщения в конференцию MyChat
OnlyAdvUsersMsgScriptResult.png (23.73 КБ) Просмотров: 2601

Код: Выделить всё
// ---------------------------------------
// Script created by Alexey Pikurov ([email protected])
// 17.01.2021 12:24:45
// ---------------------------------------
const
  NOTIFY_FLAG = true; // true/false: уведомлять пользователя, что он не может писать сообщение в канал
  RESTRICTED_CONFS = '|main|work|sales|Главный|';
  ALLOWED_ROLES    = '|Администраторы|Операторы|';
 
function OnConfMessage(iCID, iUIN, iUID, iMsgType: integer; sConfName, sMsg: string): boolean;
var
  sRoleName: string;
  bFlag: boolean;
begin
  bFlag := true;
 
    if pos('|' + sConfName + '|', RESTRICTED_CONFS) <> 0 then begin
      sRoleName := mGetUserRoleName(iUIN);
   
        if pos('|' + sRoleName + '|', ALLOWED_ROLES) = 0 then begin
          bFlag := false;
         
            if NOTIFY_FLAG then
              mSendCustomMsgToClientConsoleByCID(iCID,
                                                 'Извините, вы не можете отправлять сообщения в конференцию #' + sConfName,
                                                 'Status', true, true, 74);
        end; 
    end;
   
  result := bFlag; 
end;

begin

end.
Аватара пользователя
Eduard Rogov
Подскажите пожалуйста, что я делаю не так? Состоящим в группе "Администраторы" и включив следующий скрипт, мне выдает как и всем сообщение о невозможности отправки.

Код: Выделить всё

// ---------------------------------------
// Script created by Alexey Pikurov ([email protected])
// 17.01.2021 12:24:45
// ---------------------------------------
const
  NOTIFY_FLAG = true; // true/false: уведомлять пользователя, что он не может писать сообщение в канал
  RESTRICTED_CONFS = '|Общая УДМС|';
  ALLOWED_ROLES    = '|Администраторы|Руководители|Специалист по кадрам|';
 
function OnConfMessage(iCID, iUIN, iUID, iMsgType: integer; sConfName, sMsg: string): boolean;
var
  sRoleName: string;
  bFlag: boolean;
begin
  bFlag := true;
 
    if pos('|' + sConfName + '|', RESTRICTED_CONFS) <> 0 then begin
      sRoleName := mGetUserRoleName(iUIN);
   
        if pos('|' + sConfName + '|', ALLOWED_ROLES) = 0 then begin
          bFlag := false;
         
            if NOTIFY_FLAG then
              mSendCustomMsgToClientConsoleByCID(iCID,
                                                 'Извините, вы не можете отправлять сообщения в конференцию #' + sConfName,
                                                 'Status', true, true, 74);
        end; 
    end;
   
  result := bFlag; 
end;

begin

end.
Аватара пользователя
Алексей Пикуров
Чтобы ответить на этот вопрос, включите логирование и посмотрите, в каком месте скрипт работает не так, как вам хочется.
Аватара пользователя
Алексей Пикуров
Могу предположить, что группа прав вашего пользователя не попадает в перечисленный список, скорее всего.
Аватара пользователя
Eduard Rogov
В группе Администраторы....
Вложения
2021-09-10_15-05-21.png
2021-09-10_15-05-21.png (53.38 КБ) Просмотров: 2240
2021-09-10_15-04-38.png
2021-09-10_15-04-38.png (55.31 КБ) Просмотров: 2240
Аватара пользователя
Алексей Пикуров
Залогируйте iUIN, iUID, sConfName и sRoleName в файл внутри скрипта и посмотрите, что там за данные в момент активации события, чтобы понять, что не так с логикой.
Аватара пользователя
Алексей Пикуров
А, всё понятно. Вас не смущает строчка?

Код: Выделить всё
if pos('|' + sConfName + '|', ALLOWED_ROLES) = 0 then begin

Вы ищете, разрешена ли роль, но подставляете туда название конференции.
Аватара пользователя
Eduard Rogov
Так это же с первого сообщения топика скрипт?)
Аватара пользователя
Алексей Пикуров
Да, вероятно, опечатка. Поправили сообщение.
Аватара пользователя
Алексей Пикуров
Вы же знаете, что весь код в интернете — это г....о :) Всегда читайте и думайте, что он делает. Все ошибаются.