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

  1. Создаём на компьютере с сервером MyChat папку "c:\messages\broadcast\".
  2. Добавляем туда текстовые файлы, которые делаем в обычном Блокноте. Названия файлов — это время, когда должны отправляться сообщения. Например, "17.35.txt" или "08.00.txt". Расширение .txt Блокнот добавляет автоматически при сохранении файла. Время должно быть кратно пяти минутам.
  3. Создаём одну или несколько групп пользователей в MyChat Server и добавляем туда людей, для которых будут делаться оповещения.
  4. Создаём скрипт на событие "User defined scripts", "Every 5 minutes", включаем его.
  5. Профит!
Как это выглядит в редакторе скриптов:

script-broadcast-to-group-from-file.png
Скрипт для отправки оповещения из текстовых файлов для групп людей в MyChat
script-broadcast-to-group-from-file.png (82.9 КБ) Просмотров: 4271

Текст скрипта:
Код: Выделить всё
// ---------------------------------------
// Script created by Алексей Пикуров ([email protected])
// отправка оповещений по времени из текстовых файлов
// для указанных групп людей
// 15.09.2018 14:13:00
// ---------------------------------------

const
  sGroupsList = 'Special'; // группы пользователей, через запятую, без пробелов
  sPath = 'c:\messages\broadcast\'; // путь на диске сервера, откуда брать файлы для оповещений
var
  sFullName, sFileName, sMsg, sUsersList, sCurrentGroup, sGroupsOriginal: string;
  iDay: integer;
  bFlag: boolean;
begin
  iDay := DayOfTheWeek(Now);
  sFileName := FormatDatetime('hh.nn', Now) + '.txt'; // например, 17.45.txt
 
  sGroupsOriginal := sGroupsList;
 
    while length(sGroupsOriginal) > 0 do begin
      sCurrentGroup := GetNextSt(sGroupsOriginal, ',');

      sFullName := sPath + sFileName;
     
        if FileExists(sFullName) then
          if iDay < 6 then begin // выполняем скрипт только по рабочим дням
            sMsg := Trim(LoadTextFromFile(sFullName, 0));
     
            if length(sMsg) > 0 then begin
              sUsersList := mGetUsersListInGroupsByNames(sCurrentGroup);
         
                if length(sUsersList) > 0 then
                  mSendBroadcast(sMsg, sUsersList, EndOfTheDay(Now), 1);
            end; 
          end;
    end;
end.
Аватара пользователя
tfosn
Отправил 4 подряд оповещения, не дает закрыть окно оповещения
Screenshot_159.jpg
Screenshot_159.jpg (28.76 КБ) Просмотров: 3993

выключил через диспетчер задач,
включил снова
появилось окно снова но с новыми кнопками
Screenshot_160.jpg
Screenshot_160.jpg (21.9 КБ) Просмотров: 3993

т.е. пока я в каждом не поставил галочку окно не закрывалось. но до перезагрузки приложения я этого сделать не мог так как кнопок перемещения между оповещениями не было
Аватара пользователя
tfosn
Еще вариант одно оповещение одно окно т.е. 4 окна каждое по верх предыдущего, т.к. не все понимают что нужно кнопку вбок нажать и поставить еще одну галочку.
Аватара пользователя
Алексей Пикуров
Так а в чём проблема-то? Вы отправили оповещение с требованием подтверждения о прочтении, на клиенте появляется окно и требует подтверждения.

Абсолютно штатное поведение.
Аватара пользователя
Алексей Пикуров
Погодите, вы хотите сказать, что у вас появилось окно оповещения, но кнопок для переключения между ними "влево-вправо" не было? Как это повторить?
Аватара пользователя
tfosn
Это штатное поведение если оповещение отправлено одно
а я отправил 4 подряд одновременно.
создайте скрипт отправляющий Вам 4 одновременных оповещения с подтверждением и попробуйте закрыть окно. скрин 1
у Вас это не получится т.к. надо поставить 4 галочки а на скрине 1 этого невозможно сделать так как нет кнопки навигации по оповещениям " Предыдущее (3)"
Эта кнопка появляется только после перезапуска клиента из диспетчера задач
Аватара пользователя
Алексей Пикуров
Окей, сейчас попробуем из скрипта. Из MyChat Client отправили 4 подряд, всё ок.
Аватара пользователя
Алексей Пикуров
Да, получилось повторить, спасибо за наблюдение, будем разбираться.
Аватара пользователя
tfosn
А так я могу людям приват отправить от алисы?

Код: Выделить всё
 'mSendPrivateMessage(0, sUIN, sMsg, 1, true);

Пишет выполнено но ни чего не приходит
Код: Выделить всё
const sGroupsList = 'aaa'; // группы пользователей, через запятую, без пробелов
       function GetUsersList(sGroupsList: string): string;
            Var
                    UsersCount, I, N: integer;
                    Str, Msg, ms, Date, User, str1, str2, str3, KKS, Status, sMsg, sGroupsOriginal, sCurrentGroup, sUsersList, sUIN, sResult : string;
   
            Begin
                Msg:='';
                UsersCount:= GetTextFileLinesCount('\\disk\TempFolder\log1.txt');
                For i:=1 to UsersCount do
                Begin
                    ms:=msg; //сохраняем Msg в ms
                    LoadLineFromFile('\\disk\TempFolder\log1.txt',i,str);//вычитываем строку из файла
                    N:=strtoint(copy(str,1,pos('|',str)-1));//получаем Uin пользователя
                    str1:=copy(str,pos('|',str)+1,length(str)-pos('|',str));//получаем вторую часть строки после разделителя
                    Date:=copy(str1,1,pos('|',str1)-1);
                    sGroupsOriginal:= sGroupsList;
                    sMsg:=Date;
                   
                    while length(sGroupsOriginal) > 0 do begin
                      sCurrentGroup := GetNextSt(sGroupsOriginal, ',');

                              sUsersList := mGetUsersListInGroupsByNames(sCurrentGroup);
 
                                if length(sUsersList) > 0 then
                                    while length(sUsersList) > 0 do begin
                                      sUIN:= GetNextSt(sUsersList, ',');
                                     sResult:= sResult+ CRLF +sUIN;
                                      result:= 'qds';
                                    mSendPrivateMessage(0, sUIN, sMsg, 1, true);
                                    end;
                                 // mSendBroadcast(sMsg, sUsersList, EndOfTheDay(Now), 1);
                        end;                   
                End;
           End;
           
           
begin
  mLogScript(GetUsersList(sGroupsList), 'Group1');
end.
Аватара пользователя
Алексей Пикуров
Можете, от Элизы. Алиса у Яндекса :) И используйте тег форматирования [code][/code]
Аватара пользователя
Алексей Пикуров
И пожалуйста, делайте отдельные темы по каждому вопросу. Спасибо.
Аватара пользователя
Алексей Пикуров
Баг исправлен, сегодня выложим свежую сборку на сайт.
Аватара пользователя
galus.pro
Сделал такой вот скрипт по образцу, проверил на ошибки компилятором, запустил ничего не произошло. Что я сделал не так ?

Код: Выделить всё
// ---------------------------------------
// Script created by я
// 06.08.2019 11:59:36
// ---------------------------------------
const
  sGroupsList = 'IT'; // группы пользователей, через запятую, без пробелов
  sPath = 'c:\messages\broadcast\'; // путь на диске сервера, откуда брать файлы для оповещений
var
  sFullName, sFileName, sMsg, sUsersList, sCurrentGroup, sGroupsOriginal: string;
  iDay: integer;
  bFlag: boolean;
begin
  iDay := DayOfTheWeek(Now);
  sFileName := FormatDatetime('hh.nn', Now) + '14.30.txt'; // например, 17.45.txt
 
  sGroupsOriginal := sGroupsList;
 
    while length(sGroupsOriginal) > 0 do begin
      sCurrentGroup := GetNextSt(sGroupsOriginal, ',');

      sFullName := sPath + sFileName;
     
        if FileExists(sFullName) then
          if iDay < 6 then begin // выполняем скрипт только по рабочим дням
            sMsg := Trim(LoadTextFromFile(sFullName, 0));
     
            if length(sMsg) > 0 then begin
              sUsersList := mGetUsersListInGroupsByNames(sCurrentGroup);
         
                if length(sUsersList) > 0 then
                  mSendBroadcast(sMsg, sUsersList, EndOfTheDay(Now), 1);
            end; 
          end;
    end;
end.
Аватара пользователя
Алексей Пикуров
Обрамляйте текст скрипта в тег code..code

Формально всё правильно. А что конкретно вы хотите сделать?

Вы смысл данного конкретного скрипта понимаете?
Аватара пользователя
galus.pro
Задача делать каждый день напоминания в определенное время определенной группе. В файле 14.30.txt -текст напоминания. IT- группа (кому напоминание ). В создании скриптов опыта нет((
Аватара пользователя
Алексей Пикуров
Хорошо. Чтобы проверить, что скрипт работает, вам нужно выполнить его ровно в 14:30

Код: Выделить всё
 sFileName := FormatDatetime('hh.nn', Now) + '14.30.txt'; // например, 17.45.txt

Для проверки это неудобно, логично для теста заменить эту строку просто присваиванием, без привязки ко времени:

Код: Выделить всё
 sFileName := '14.30.txt';

Ну и на сервере должен быть текстовый файл c:\messages\broadcast\14.30.txt