Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
rustambek
Добрый день.
Не отработал скрипт, в чем может быть проблема?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Алексей Пикуров
Добрый день. Скрипт работал очень долго, компьютер тормозил либо пользователей слишком много.

Можете в 42-й строке вместо

Код: Выделить всё
SetScriptTimeOut(20000);

указать таймаут в 30000 (30 секунд). Или выполнить скрипт повторно.
Аватара пользователя
Алексей Пикуров
А что это у вас в исходниках за "если", "начать", "конец" и "или" ???
Аватара пользователя
CyberDynamic
Кажися браузерный переводчик нагнул админку [smilie=biggrin.gif]
Аватара пользователя
Алексей Пикуров
Рустам, разобрались с проблемой? Установка бОльшего тайм-аута помогла решить вопрос?
rustambek
Добрый день.
Не помогло. Какие еще есть варианты?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Алексей Пикуров
Покажите текст скрипта, пожалуйста.
rustambek
Код: Выделить всё
// CheckEmptyUsersFields service script
//------------------------------------------------------------------------------------
// If you have users with empty fields, you can export full list of them to a CSV file
// and analyze it in Excel.
// -----------------------------------------------------------------------------------
// ver 1.0 / 19 Feb 2016, (c) Alexey Pikurov, [email protected]
// help (russian) - https://www.nsoft-s.com/forum/viewtopic.php?f=1&t=4129
//------------------------------------------------------------------------------------
const
  EXPORT_FILE_NAME      = 'c:\users_report.csv';
 
  CHECK_WHAT            = '<COMMON>,<WORK>,<HOME>';
  //CHECK_WHAT            = '<MY>';
 
  //MY_SET = 'FotoCRC32';
  COMMON_FIELDS_MIN_SET = 'FirstName;MiddleName;LastName;Birthday;Sex;FotoCRC32;';
  WORK_FIELDS_SET       = 'Email;WorkPosition;WorkCompanyName;WorkOffice;WorkPhone;WorkFax;' +
                          'WorkPager;WorkStreetAddress;WorkCity;WorkState;WorkZIP;WorkCountry;WorkWWW;';
  HOME_FIELDS_SET       = 'MaritalStatus;HomePhone;HomeFax;HomeCellular;HomeStreetAddress;HomeCity;HomeState;HomeZIP;HomeCountry;HomeWWW;';
 
function CheckDate(dt: double): boolean;
var
  iYears: integer;
begin
  iYears := YearsBetween(Now, dt);
 
    if (iYears > 100) or (iYears < 16) then result := false
      else result := true;
end;

var
  sUsersList, sJSON, sOut, sUserData, sTitle,
  sNick, sFirstName, sMiddleName, sLastName, sBirthday, sSex, sFoto,
  sEmail, sWorkPosition, sWorkCompanyName, sWorkOffice, sWorkPhone, sWorkFax,
  sWorkPager, sWorkStreetAddress, sWorkCity, sWorkState, sWorkZIP, sWorkWWW,
  sWorkCountry, sMaritalStatus, sHomePhone, sHomeFax, sHomeCellular,
  sHomeStreetAddress, sHomeCity, sHomeState, sHomeZIP, sHomeCountry, sHomeWWW: string;
 
  iMaritalStatus, iHomeCountry, iUIN, iSex, iFotoCRC32, iWorkCountry: integer;

  dtBirthday: double;
  bFlag: boolean;
begin
  SetScriptTimeOut(40000);

  sUsersList := mGetUINSListByRole(-1);

  DeleteFile(EXPORT_FILE_NAME);
 
  sOut   := '';
  sTitle := 'UIN;Nick;';
 
    if pos('<COMMON>', CHECK_WHAT) <> 0 then sTitle := sTitle + COMMON_FIELDS_MIN_SET;
    if pos('<WORK>', CHECK_WHAT) <> 0 then sTitle := sTitle + WORK_FIELDS_SET;
    if pos('<HOME>', CHECK_WHAT) <> 0 then sTitle := sTitle + HOME_FIELDS_SET;
    //if pos('<MY>', CHECK_WHAT) <> 0 then sTitle := sTitle + MY_SET;
 
  AddLineToFile(sTitle, EXPORT_FILE_NAME);     
 
    while length(sUsersList) > 0 do begin
      bFlag := false;
     
      iUIN := StrToInt(GetNextSt(sUsersList, ','));
      sJSON := mGetUserDataAsJSON(iUIN, 'Nick;' + COMMON_FIELDS_MIN_SET + WORK_FIELDS_SET + HOME_FIELDS_SET);
     
      AddLineToFile(sJSON, 'c:\temp\' + inttostr(iUIN) + '.txt');
      JSONGetString(sJSON, 'Nick', sNick);
     
      sUserData := inttostr(iUIN) + ';' +
                   DecorateStForCSV(sNick) + ';';
// COMMON -----------------------------------------------------------------------------------------     
        if pos('<COMMON>', CHECK_WHAT) <> 0 then begin
          JSONGetString(sJSON, 'FirstName', sFirstName);
          JSONGetString(sJSON, 'MiddleName', sMiddleName);
          JSONGetString(sJSON, 'LastName', sLastName);
          JSONGetDateTime(sJSON, 'Birthday', dtBirthday);
     
            if CheckDate(dtBirthday) then sBirthday := FormatDateTime('dd.mm.yyyy', dtBirthday)
              else sBirthday := '';

          JSONGetInteger(sJSON, 'Sex', iSex);
     
            case iSex of
              0: sSex := '';
              1: sSex := 'male';
              2: sSex := 'female';
            end;
       
          JSONGetInteger(sJSON, 'FotoCRC32', iFotoCRC32);
     
            if iFotoCRC32 = 0 then sFoto := '' else sFoto := 'yes';
     
            if (length(sFirstName) = 0) or (length(sMiddleName) = 0) or (length(sLastName) = 0) or
               (length(sBirthday) = 0) or (length(sSex) = 0) or (length(sFoto) = 0) then bFlag := true;
         
          sUserData := sUserData +
                       DecorateStForCSV(sFirstName) + ';' +
                       DecorateStForCSV(sMiddleName) + ';' +
                       DecorateStForCSV(sLastName) + ';' +
                       DecorateStForCSV(sBirthday) + ';' +
                       sSex + ';' +
                       sFoto + ';';
        end;                   
// WORK --------------------------------------------------------------------------------------------                 
        if pos('<WORK>', CHECK_WHAT) <> 0 then begin
          JSONGetString(sJSON, 'Email', sEmail);
          JSONGetString(sJSON, 'WorkPosition', sWorkPosition);
          JSONGetString(sJSON, 'WorkCompanyName', sWorkCompanyName);
          JSONGetString(sJSON, 'WorkOffice', sWorkOffice);
          JSONGetString(sJSON, 'WorkPhone', sWorkPhone);
          JSONGetString(sJSON, 'WorkFax', sWorkFax);
          JSONGetString(sJSON, 'WorkPager', sWorkPager);
          JSONGetString(sJSON, 'WorkStreetAddress', sWorkStreetAddress);
          JSONGetString(sJSON, 'WorkCity', sWorkCity);
          JSONGetString(sJSON, 'WorkState', sWorkState);
          JSONGetString(sJSON, 'WorkZIP', sWorkZIP);
          JSONGetInteger(sJSON, 'WorkCountry', iWorkCountry);
     
            if iWorkCountry = 0 then sWorkCountry := ''
              else sWorkCountry := 'yes';
                   
          JSONGetString(sJSON, 'WorkWWW', sWorkWWW);
     
            if (length(sEmail) = 0) or (length(sWorkPosition) = 0) or (length(sWorkCompanyName) = 0) or
               (length(sWorkOffice) = 0) or (length(sWorkPhone) = 0) or (length(sWorkFax) = 0) or
               (length(sWorkPager) = 0) or (length(sWorkStreetAddress) = 0) or (length(sWorkCity) = 0) or
               (length(sWorkState) = 0) or (length(sWorkZIP) = 0) or (length(sWorkCountry) = 0) then bFlag := true;
         
          sUserData := sUserData +
                       DecorateStForCSV(sEmail) + ';' +
                       DecorateStForCSV(sWorkPosition) + ';' +
                       DecorateStForCSV(sWorkCompanyName) + ';' +
                       DecorateStForCSV(sWorkOffice) + ';' +
                       DecorateStForCSV(sWorkPhone) + ';' +
                       DecorateStForCSV(sWorkFax) + ';' +
                       DecorateStForCSV(sWorkPager) + ';' +
                       DecorateStForCSV(sWorkStreetAddress) + ';' +
                       DecorateStForCSV(sWorkCity) + ';' +
                       DecorateStForCSV(sWorkState) + ';' +
                       DecorateStForCSV(sWorkZIP) + ';' +
                       DecorateStForCSV(sWorkCountry) + ';' +
                       DecorateStForCSV(sWorkWWW) + ';';
        end;                   
// HOME -------------------------------------------------------------------------------------------     
        if pos('<HOME>', CHECK_WHAT) <> 0 then begin
          JSONGetInteger(sJSON, 'MaritalStatus', iMaritalStatus);
         
            if iMaritalStatus = -1 then sMaritalStatus := '' else sMaritalStatus := 'yes';
           
          JSONGetString(sJSON, 'HomePhone', sHomePhone);
          JSONGetString(sJSON, 'HomeFax', sHomeFax);
          JSONGetString(sJSON, 'HomeCellular', sHomeCellular);
          JSONGetString(sJSON, 'HomeStreetAddress', sHomeStreetAddress);
          JSONGetString(sJSON, 'HomeCity', sHomeCity);
          JSONGetString(sJSON, 'HomeState', sHomeState);         
          JSONGetString(sJSON, 'HomeZIP', sHomeZIP);
          JSONGetInteger(sJSON, 'HomeCountry', iHomeCountry);
         
            if iHomeCountry = -1 then sHomeCountry := '' else sHomeCountry := 'yes';         
           
          JSONGetString(sJSON, 'HomeWWW', sHomeWWW);
     
            if (length(sMaritalStatus) = 0) or (length(sHomePhone) = 0) or (length(sHomeFax) = 0) or
               (length(sHomeCellular) = 0) or (length(sHomeStreetAddress) = 0) or (length(sHomeCity) = 0) or
               (length(sHomeState) = 0) or (length(sHomeZIP) = 0) or (length(sHomeCountry) = 0) then bFlag := true;
         
          sUserData := sUserData +
                       DecorateStForCSV(sMaritalStatus) + ';' +
                       DecorateStForCSV(sHomePhone) + ';' +
                       DecorateStForCSV(sHomeFax) + ';' +
                       DecorateStForCSV(sHomeCellular) + ';' +
                       DecorateStForCSV(sHomeStreetAddress) + ';' +
                       DecorateStForCSV(sHomeCity) + ';' +
                       DecorateStForCSV(sHomeState) + ';' +
                       DecorateStForCSV(sHomeZIP) + ';' +
                       DecorateStForCSV(sHomeCountry) + ';';
        end;                   
// -------------------------------------------------------------------------------------------------
      if bFlag then sOut := sOut + sUserData + #13#10;
    end;
   
  AddLineToFile(sOut, EXPORT_FILE_NAME);   
end.
Аватара пользователя
Алексей Пикуров
Сколько у вас на сервере зарегистрировано пользователей?
rustambek
Добрый день.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Алексей Пикуров
Совсем немного, я тестировал только что этот скрипт в версии 7.7 на базе 9.5 тысяч пользователей, он отработал за 16 секунд на моём Core i7.

У меня два варианта: либо компьютер адски тормозит, либо в базе что-то у вас не так. Можете сделать резервную копию файла C:\ProgramData\MyChat Server\db\mcserv.db (достать её из файла бекапа) и отправить мне чатом (в подписи)?

Я проверю работу скрипта на ваших данных.
rustambek
Добрый день.

Скинул чатом.
rustambek
Добрый день.

Вы получили мой backup?
Аватара пользователя
Алексей Пикуров
Добрый. Да, бекап есть, отвечу завтра.
rustambek
Добрый день.

Как дела с моим бэкапом?
Аватара пользователя
Алексей Пикуров
Здравствуйте, Рустам.

Ваш скрипт отработал за две секунды, всё Ок.

Есть более свежая версия скрипта, она работает быстрее:

Код: Выделить всё
// CheckEmptyUsersFields service script
//------------------------------------------------------------------------------------
// If you have users with empty fields, you can export full list of them to a CSV file
// and analyze it in Excel.
// -----------------------------------------------------------------------------------
// ver 1.1 / 4 Feb 2020, (c) Alexey Pikurov, [email protected]
// help (russian) - https://www.nsoft-s.com/forum/viewtopic.php?f=1&t=4129
//------------------------------------------------------------------------------------
const
  EXPORT_FILE_NAME      = 'c:\temp\users_report.csv';
 
  CHECK_WHAT            = '<COMMON>,<WORK>,<HOME>';
 
  COMMON_FIELDS_MIN_SET = 'FirstName;MiddleName;LastName;Birthday;Sex;FotoCRC32;';
  WORK_FIELDS_SET       = 'Email;WorkPosition;WorkCompanyName;WorkOffice;WorkPhone;WorkFax;' +
                          'WorkPager;WorkStreetAddress;WorkCity;WorkState;WorkZIP;WorkCountry;WorkWWW;';
  HOME_FIELDS_SET       = 'MaritalStatus;HomePhone;HomeFax;HomeCellular;HomeStreetAddress;HomeCity;HomeState;HomeZIP;HomeCountry;HomeWWW;';
 
function CheckDate(dt: double): boolean;
var
  iYears: integer;
begin
  iYears := YearsBetween(Now, dt);
 
    if (iYears > 100) or (iYears < 16) then result := false
      else result := true;
end;

var
  sUsersList, sJSON, sOut, sUserData, sTitle,
  sNick, sFirstName, sMiddleName, sLastName, sBirthday, sSex, sFoto,
  sEmail, sWorkPosition, sWorkCompanyName, sWorkOffice, sWorkPhone, sWorkFax,
  sWorkPager, sWorkStreetAddress, sWorkCity, sWorkState, sWorkZIP, sWorkWWW,
  sWorkCountry, sMaritalStatus, sHomePhone, sHomeFax, sHomeCellular,
  sHomeStreetAddress, sHomeCity, sHomeState, sHomeZIP, sHomeCountry, sHomeWWW: string;
 
  iMaritalStatus, iHomeCountry, iUIN, iSex, iFotoCRC32, iWorkCountry: integer;

  dtBirthday: double;
  bFlag: boolean;
  iCount: integer;
begin
  SetScriptTimeOut(120000);

  sUsersList := mGetUINSListByRole(-1);

  DeleteFile(EXPORT_FILE_NAME);
 
  sOut   := '';
  sTitle := 'UIN;Nick;';
 
    if pos('<COMMON>', CHECK_WHAT) <> 0 then sTitle := sTitle + COMMON_FIELDS_MIN_SET;
    if pos('<WORK>', CHECK_WHAT) <> 0 then sTitle := sTitle + WORK_FIELDS_SET;
    if pos('<HOME>', CHECK_WHAT) <> 0 then sTitle := sTitle + HOME_FIELDS_SET;
 
  AddLineToFile(sTitle, EXPORT_FILE_NAME, 1);     
  iCount := 0;
 
    while length(sUsersList) > 0 do begin
      bFlag := false;
     
      iUIN := StrToInt(GetNextSt(sUsersList, ','));
      sJSON := mGetUserDataAsJSON(iUIN, 'Nick;' + COMMON_FIELDS_MIN_SET + WORK_FIELDS_SET + HOME_FIELDS_SET);
     
      JSONGetString(sJSON, 'Nick', sNick);
     
      sUserData := inttostr(iUIN) + ';' +
                   DecorateStForCSV(sNick) + ';';
// COMMON -----------------------------------------------------------------------------------------     
        if pos('<COMMON>', CHECK_WHAT) <> 0 then begin
          JSONGetString(sJSON, 'FirstName', sFirstName);
          JSONGetString(sJSON, 'MiddleName', sMiddleName);
          JSONGetString(sJSON, 'LastName', sLastName);
          JSONGetDateTime(sJSON, 'Birthday', dtBirthday);
     
            if CheckDate(dtBirthday) then sBirthday := FormatDateTime('dd.mm.yyyy', dtBirthday)
              else sBirthday := '';

          JSONGetInteger(sJSON, 'Sex', iSex);
     
            case iSex of
              0: sSex := '';
              1: sSex := 'male';
              2: sSex := 'female';
            end;
       
          JSONGetInteger(sJSON, 'FotoCRC32', iFotoCRC32);
     
            if iFotoCRC32 = 0 then sFoto := '' else sFoto := 'yes';
     
            if (length(sFirstName) = 0) or (length(sMiddleName) = 0) or (length(sLastName) = 0) or
               (length(sBirthday) = 0) or (length(sSex) = 0) or (length(sFoto) = 0) then bFlag := true;
         
          sUserData := sUserData +
                       DecorateStForCSV(sFirstName) + ';' +
                       DecorateStForCSV(sMiddleName) + ';' +
                       DecorateStForCSV(sLastName) + ';' +
                       DecorateStForCSV(sBirthday) + ';' +
                       sSex + ';' +
                       sFoto + ';';
        end;                   
// WORK --------------------------------------------------------------------------------------------                 
        if pos('<WORK>', CHECK_WHAT) <> 0 then begin
          JSONGetString(sJSON, 'Email', sEmail);
          JSONGetString(sJSON, 'WorkPosition', sWorkPosition);
          JSONGetString(sJSON, 'WorkCompanyName', sWorkCompanyName);
          JSONGetString(sJSON, 'WorkOffice', sWorkOffice);
          JSONGetString(sJSON, 'WorkPhone', sWorkPhone);
          JSONGetString(sJSON, 'WorkFax', sWorkFax);
          JSONGetString(sJSON, 'WorkPager', sWorkPager);
          JSONGetString(sJSON, 'WorkStreetAddress', sWorkStreetAddress);
          JSONGetString(sJSON, 'WorkCity', sWorkCity);
          JSONGetString(sJSON, 'WorkState', sWorkState);
          JSONGetString(sJSON, 'WorkZIP', sWorkZIP);
          JSONGetInteger(sJSON, 'WorkCountry', iWorkCountry);
     
            if iWorkCountry = 0 then sWorkCountry := ''
              else sWorkCountry := 'yes';
                   
          JSONGetString(sJSON, 'WorkWWW', sWorkWWW);
     
            if (length(sEmail) = 0) or (length(sWorkPosition) = 0) or (length(sWorkCompanyName) = 0) or
               (length(sWorkOffice) = 0) or (length(sWorkPhone) = 0) or (length(sWorkFax) = 0) or
               (length(sWorkPager) = 0) or (length(sWorkStreetAddress) = 0) or (length(sWorkCity) = 0) or
               (length(sWorkState) = 0) or (length(sWorkZIP) = 0) or (length(sWorkCountry) = 0) then bFlag := true;
         
          sUserData := sUserData +
                       DecorateStForCSV(sEmail) + ';' +
                       DecorateStForCSV(sWorkPosition) + ';' +
                       DecorateStForCSV(sWorkCompanyName) + ';' +
                       DecorateStForCSV(sWorkOffice) + ';' +
                       DecorateStForCSV(sWorkPhone) + ';' +
                       DecorateStForCSV(sWorkFax) + ';' +
                       DecorateStForCSV(sWorkPager) + ';' +
                       DecorateStForCSV(sWorkStreetAddress) + ';' +
                       DecorateStForCSV(sWorkCity) + ';' +
                       DecorateStForCSV(sWorkState) + ';' +
                       DecorateStForCSV(sWorkZIP) + ';' +
                       DecorateStForCSV(sWorkCountry) + ';' +
                       DecorateStForCSV(sWorkWWW) + ';';
        end;                   
// HOME -------------------------------------------------------------------------------------------     
        if pos('<HOME>', CHECK_WHAT) <> 0 then begin
          JSONGetInteger(sJSON, 'MaritalStatus', iMaritalStatus);
         
            if iMaritalStatus = -1 then sMaritalStatus := '' else sMaritalStatus := 'yes';
           
          JSONGetString(sJSON, 'HomePhone', sHomePhone);
          JSONGetString(sJSON, 'HomeFax', sHomeFax);
          JSONGetString(sJSON, 'HomeCellular', sHomeCellular);
          JSONGetString(sJSON, 'HomeStreetAddress', sHomeStreetAddress);
          JSONGetString(sJSON, 'HomeCity', sHomeCity);
          JSONGetString(sJSON, 'HomeState', sHomeState);         
          JSONGetString(sJSON, 'HomeZIP', sHomeZIP);
          JSONGetInteger(sJSON, 'HomeCountry', iHomeCountry);
         
            if iHomeCountry = -1 then sHomeCountry := '' else sHomeCountry := 'yes';         
           
          JSONGetString(sJSON, 'HomeWWW', sHomeWWW);
     
            if (length(sMaritalStatus) = 0) or (length(sHomePhone) = 0) or (length(sHomeFax) = 0) or
               (length(sHomeCellular) = 0) or (length(sHomeStreetAddress) = 0) or (length(sHomeCity) = 0) or
               (length(sHomeState) = 0) or (length(sHomeZIP) = 0) or (length(sHomeCountry) = 0) then bFlag := true;
         
          sUserData := sUserData +
                       DecorateStForCSV(sMaritalStatus) + ';' +
                       DecorateStForCSV(sHomePhone) + ';' +
                       DecorateStForCSV(sHomeFax) + ';' +
                       DecorateStForCSV(sHomeCellular) + ';' +
                       DecorateStForCSV(sHomeStreetAddress) + ';' +
                       DecorateStForCSV(sHomeCity) + ';' +
                       DecorateStForCSV(sHomeState) + ';' +
                       DecorateStForCSV(sHomeZIP) + ';' +
                       DecorateStForCSV(sHomeCountry) + ';';
        end;                   
// -------------------------------------------------------------------------------------------------
      if bFlag then begin
        sOut := sOut + sUserData + #13#10;
       
        inc(iCount);     
   
          if (iCount mod 500) = 0 then begin
            AddLineToFile(sOut, EXPORT_FILE_NAME, 1);   
            sOut := '';
          end; 
      end; 
    end;
 
    if length(sOut) > 0 then AddLineToFile(sOut, EXPORT_FILE_NAME, 1);   
end.

Вставьте этот код вместо старого скрипта, запустите AnyDesk и свяжитесь со мной чатом.
rustambek
Добрый день.

Вопрос решен, спасибо.
Аватара пользователя
Алексей Пикуров
Переношу тему в раздел скриптов.