Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
Владимир.Егоров
Предыдущий код-оказался частично верным- результат функции не связан с остальной частью кода, переработано так как единственная задача функции получить аргументы и и передать в параметры:
Код: Выделить всё
// Script created by admin (UIN )
// 05.03.2018 11:40:03
// ---------------------------------------

program NoticeGet;
var
IntermediateVariable, sMsg, UserListStore, s: string;
sArray  : array of integer;
wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliSecond: word;
CountStore,SendMsg, Count, NumberUsers, i, iUIN: integer;
time, dtNow: double;

const
SetTimeHour=11;

Group1='Группа1';
 function GetUserList(sUINList:string):string;
    var
    sData,sUIN,sResult:string;
    UserListStore:string;
    begin
       sData:=sUINList;
        while length(sData)>0 do begin
        sUIN:=GetNextSt(sData,',');
        sResult:=sResult+sUIN+',';
     end;
     result:=sResult;
     end;

  begin
     
     UserListStore:=GetUserList(mGetUsersListInGroupByName(Group1));
     IntermediateVariable:=UserListStore;
     i:=0;
     dtNow:=Now
      DecodeDateTime(Now, wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliSecond);
     NumberUsers:=i;
     if (wHour=SetTimeHour) then begin
     while length(IntermediateVariable)>0 do
     begin
     sMsg:=GetNextSt(IntermediateVariable, ',');
     i:=i+1;
     SendMsg:=mSendBroadcast('Доброе утро',sMsg,EndofTheDay(Now),0);
     end;
     
   DecodeDateTime(Now, wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliSecond);
   NumberUsers:=i;
 
      
    // mSendCustomMsgToClientConsoleByCID(0, 'WEB support session from UIN ' + '120', 'newmsg', false, true, 78);
   //  SendMsg:=mSendBroadcast('----test---','120',EndofTheDay(Now),0)


Дальше функция была удалена и все ок. Или можно вот так переработать. Рабочий скрипт -прошу не корить за лишние замарочки. Нашел сегодня 4 часа и переработал полностью:

Код: Выделить всё
// ---------------------------------------
// Script created by admin (UIN 1)
// 14.03.2018 09:20:48
// ---------------------------------------
program NoticeGet;
var
IntermediateVariable, sMsg, UserListStore, s: string;
sArray  : array of integer;
wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliSecond: word;
CountStore,SendMsg, Count, NumberUsers, i, iUIN,l: integer;
time, dtNow: double;


const
SetTimeHour=15;

Group1='Группа1';
 function GetUserList(sUINList:string):string;
 
    var
    UIN:integer;
    sData,sUIN,sResult,duplicate:string;
    UserListStore:string;
    i,d,counter,firstchar,lastchar:integer;
    subArray : array[1..100] of string;
    a : array of string;
    begin
       SetScriptTimeOut(10000);
       sData:=sUINList;
        i:=0;
        while length(sData)>0 do begin
        sUIN:=GetNextSt(sData,',');                      // выводим все UIN столбцом
       
        Inc(i);                                    // инкремент-число UIN
        end;                                 
        duplicate:=sUINList;                                   
        mLogScript(duplicate, '');                 
        for counter:=1 to i do begin                  // цикл до последнего числа
            d:=pos(',',duplicate);                   //номер запятой после каждой итерации || последнее число без запятой в конце поэтому обход этой переменной (d) при присвоении переменной UIN последнего числа из строки
             //mLogScript(duplicate, '');
             //mLogScript(IntToStr(iSum), '');
             
             mLogScript(IntToStr(counter), '');
             
             if d>0 then begin
           UIN:=StrToInt(copy(duplicate,1,d-1));     //присвоение данных переменной  UIN до запятой         
             subArray[counter] :=IntToStr(UIN);   
             mLogScript(subArray[counter],'20.00');
            delete(duplicate,1,d);                  // очистка предыдущего значения UIN с запятой
            end
            else begin
            lastchar:=length(duplicate);
           
            UIN:=StrToInt(copy(duplicate,1,lastchar));       
            subArray[counter] :=IntToStr(UIN);
            mLogScript(subArray[counter],'20.01');
            mLogScript(IntToStr(counter),'20.01');
           
            //mLogScript(sResult, '');
           // l:=subArray[1];
           end;
        end;
        //UIN:=StrToInt(copy(duplicate,1,1));
        //subArray[counter+1] :=IntToStr(UIN);                 II  присвоение переменной UIN[counter+1] - последнего числа из строки без запятой в конце
        //mLogScript(subArray[counter+1],'9.03');              С циклом от i do i-1 - до предпоследнего числа( альтернатива выше написанного алгоритма)
        //mLogScript(IntToStr(counter+1),'9.03');
        //mLogScript(IntToStr(UIN), '');
        result:=subArray[counter];
        dtNow:=Now
      DecodeDateTime(Now, wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliSecond);
     NumberUsers:=i;
        if (wHour=SetTimeHour) then begin
           for firstchar:=1 to i do begin
           
            //sMsg:=GetNextSt(IntermediateVariable, ',');
           
           SendMsg:=mSendBroadcast('Доброе утро',subArray[firstchar],EndofTheDay(Now),0);
           
            end;
           
        end;
     end;
     begin
     GetUserList(mGetUsersListInGroupByName(Group1))
   
     begin   
     //передача аргумента Group1 параметру функции sUINList -
     
    // mLogScript(IntermediateVariable, '');
     
                                                  // проверить i
 
           //while length(IntermediateVariable)>0 do
           //begin
           // l:=1;
     //sMsg:=GetNextSt(IntermediateVariable, ',');
     //i:=i+1;
           // function GetUserList(sUINList:string):string;
     
           //   begin
              //for l:=1 to i do begin
           
             //    SendMsg:=mSendBroadcast('Добрый день',result,EndofTheDay(Now),0);
              //end;
           // end;
       
     end;
   
 
      
 
     
     //end;
     end.


Так же сегодня обнаружил опечатку в коде с официальной инструкции по функции mIsUserInGroup :

Код: Выделить всё
const
  USER_UIN = 6;
  GROUPS_LIST = 'Administrators,Moderators,Others';
var
  sData, sName, s, sUserName: string;
begin
  sData := GROUPS_LIST;
 
  sUserName := mGetUserAttribute(USER_UIN, 'DisplayName');
  mLogScript('User "' + sUserName + '" is on the group list?', '');
 
    while length(sData) > 0 do begin
      sName := GetNextSt(sData, ',');
     
        if mIsUserInGroup(USER_UIN, s) then s := 'YES'
          else s := 'NO';
         
      mLogScript(sName, s);
    end;
end.


В данном случае ответ будет всегда No.Так как по сравнению если пользователь найден то в группе то true иначе ложь. группа не найдена по идентификатору s. Должен быть -- sName , тогда :
Код: Выделить всё
const
  USER_UIN = 120;
  GROUPS_LIST = 'Группа1,Moderators,Others';
var
  sData, sName, s, sUserName: string;
begin
  sData := GROUPS_LIST;
 
  sUserName := mGetUserAttribute(USER_UIN, 'DisplayName');
  mLogScript('User "' + sUserName + '" is on the group list?', '');
 
    while length(sData) > 0 do begin
      sName := GetNextSt(sData, ',');
     
        if mIsUserInGroup(USER_UIN, sName) then s := 'YES'
          else s := 'NO';
         
      mLogScript(sName, s);
    end;
end.

Результат:
Код: Выделить всё
[16:07:49] (Log "letter2"): [YES] Группа1
[16:07:49] (Log "letter2"): [NO] Moderators
[16:07:49] (Log "letter2"): [NO] Others
Последний раз редактировалось Владимир.Егоров Вт мар 20, 2018 3:18 pm, всего редактировалось 1 раз.
Аватара пользователя
Алексей Пикуров
Спасибо за замечание насчёт справки, уже поправили.

Насчёт вашего скрипта — извините, но я не понимаю, к чему такие сложности. Вам надо разослать оповещение списку пользователей указанной группы в указанное время.

Окей, вот вам скрипт, целиком:

Код: Выделить всё
const
  TIME_TO_SAY = 15;
  GROUP_NAME = 'Группа1';
var
  sUsersList: string;
begin
  if HourOf(Now) = TIME_TO_SAY then begin
    sUsersList := mGetUsersListInGroupByName(GROUP_NAME);
     
      if length(sUsersList) > 0 then
        mSendBroadcast('Доброе утро', sUsersList, EndOfTheDay(Now), 0);
  end;
end.
Аватара пользователя
Алексей Пикуров
P.S. Переношу тему в раздел скриптов.
Аватара пользователя
Владимир.Егоров
Благодарю за ответ
Скрипт по которому у меня работала отправка сообщения - где то примерно 10 строк. Просто я отдельно написал 3 разных варианта. А это пример по массиву, думал появятся ошибки по данному примеру.
Аватара пользователя
Владимир.Егоров
Здравствуйте. при включении скрипта каждые 8 часов. через день в 8 часов после срабатывания скрипта- галочка снимается(о включении скрипта). Интересует должно ли быть так
Аватара пользователя
Алексей Пикуров
День добрый.

Не должно. Скрипт может выключаться аварийно по тайм-ауту, например. Посмотрите логи выполнения скриптов в админке, там это указано.