Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
Alexandr
Доработанный скрипт для отправки сообщения:
- при наличии интеграции с Telegram и текстового сообщения (вложения пока нет возможности передать) сообщение передается в Telegram
- При наличии почты и offline (чтобы не надоедать) отправка идет на емайл

Дополнено формирование html при наличии у отправителя емайла представление пользователя кликабельной ссылкой для быстрого ответа.

Код: Выделить всё
// -----------------------------------------------------------------------------------
// ver 1.1 / Sep 22, 2017, (c) Alexey Pikurov, [email protected]
// ver 1.2 / Dec 20, 2018, (c) Alexandr
// -----------------------------------------------------------------------------------

function IsTextMessageType( iMsgType: integer): boolean;
begin
   result := false;
   case iMsgType of
       0: result := true;
       1: result := true;
       5: result := true;
       10: result := true;
       11: result := true;
       15: result := true;
       16: result := true;
       21: result := true;
    end;
end;

function OnPrivateMessage(iCID, iUIN, iUINTo, iMsgType: integer; sMsg: string): boolean;
var
  sID, sOutMsg, sNameFrom, s, sEmailTo, sEmailFrom, sTextBody, sTextFrom, sTextSubject: string;
  bResult, bSendMessage, bNotOnline: boolean;
  iState: integer;
begin
  result := true;
   
    bNotOnline := not mIsUINOnline(iUINTo);
    bSendMessage := bNotOnline;
   
    if not bSendMessage then begin
       iState := mGetUserState(iUINTo);
        if iState = 1 then begin
           bSendMessage := true;
       end;
    end;
   
    if bSendMessage then begin
      // get sender's Telegram ID
      sID := mIntegrationTelegramGetUserIDByUIN(iUINTo);
      sEmailTo   := mGetUserPrimaryEmail(iUINTo);
      sEmailFrom := mGetUserPrimaryEmail(iUIN);
      sNameFrom := mGetUserFullNameByPreset(iUIN, 0);
     
         //Если тип сообщения строка и сотрудник подключен к боту Telegram
        //то отправка будет через Telegram (файлы все равно на телеграм не попадают смысл их передавать)
        //Иначе если не в онлайне отправка на емайл
        if (sID[1] <> '-') and (IsTextMessageType(iMsgType) = true) then begin // no errors
         
          // convert MyChat message to plaint text
          sOutMsg := mConvertMsgToPlainText(sMsg, iMsgType);
         
          // add WEB support link and user display name to message
          sOutMsg := '<a href="' +
                     mGetServerExternalAddress(0) +
                     '/support/?uin=' +
                     IntToStr(iUIN) +
                     '&silent">' +
                     sNameFrom +
                     '</a>:' +
                     CRLF +
                     CRLF +
                     sOutMsg;
                     
          // send message to Telegram
          s := mIntegrationTelegramSendMessage(sID, sOutMsg, 5000);
          bResult := true;
         
            if JSONGetBoolean(s, 'ok', bResult) <> 0 then bResult := false;
           
            // if any error occured - log result to server's system scripts protocol
            if not bResult then mLogScriptToDisk(s);
        end
        else if (length(sEmailTo) > 0) and (bNotOnline) then begin
       
          sTextSubject := 'Сообщение от '+sNameFrom + ' ' + FormatDateTime('[dd.mm.yyyy hh:nn:ss]', Now);
          if (length(sEmailFrom) > 0) then begin
              sTextFrom := '<a href="mailto:'+sEmailFrom+'">'+sNameFrom+'</a>';
          end
          else begin
              sTextFrom := sNameFrom;       
          end;   
         
          sTextBody := '<span style="color:green">' +
                       FormatDateTime('[dd.mm.yyyy hh:nn:ss]', Now) +
                       '</span>' +
                       ' '+
                       '<span style="color:blue"><b>' +
                    sTextFrom +
                       '</b></span>'+
                       '&gt; ';
                       
          if (IsTextMessageType(iMsgType) = true) then begin
             sTextBody := sTextBody + CRLF + ReplaceString(mConvertMsgToPlainText(sMsg, iMsgType), CRLF, '</br>', true, false);
          end
          else begin
             sTextBody := sTextBody + 'Вам был отправлен файл, но к большому сожалению функция передачи файла по емайлу еще не реализованна'+CRLF+'</br>';
          end;
         
          mSendEmail(sEmailTo, sTextSubject, sTextBody, 1, '');
        end;
    end;
end;

begin

end.
Аватара пользователя
teanrus
Скажите передачу файлов еще не реализовали? если да то что нужно поправить в данном скрипте?
Аватара пользователя
Алексей Пикуров
Реализовали. Новый скрипт я опубликую тут.
Аватара пользователя
Алексей Пикуров
Код: Выделить всё
// -----------------------------------------------------------------------------------
// ver 1.2 / Nov 23, 2020, (c) Alexey Pikurov, [email protected]
// -----------------------------------------------------------------------------------
function OnPrivateMessage(iCID, iUIN, iUINTo, iMsgType: integer; sMsg: string): boolean;
var
  sID, sOutMsg, sNameFrom, s: string;
  bResult: boolean;
begin
  SetScriptTimeOut(10000);

  result := true;

    if not mIsUINOnline(iUINTo) then begin
      // get sender's Telegram ID
      sID := mIntegrationTelegramGetUserIDByUIN(iUINTo);

        if sID[1] <> '-' then begin // no errors
          // get MyChat sender's display name
          sNameFrom := mGetUserFullNameByPreset(iUIN, 0);

        if (iMsgType = 2) or (iMsgType = 23) then
            sOutMsg := mExtractExternalWebLinkFromMessage(sMsg, iMsgType)
          else
            // convert MyChat message to plaint text
            sOutMsg := mConvertMsgToPlainText(sMsg, iMsgType);

          // add WEB support link and user display name to message
          sOutMsg := '<a href="' +
                     mGetServerExternalAddress(0) +
                     '/support/?uin=' +
                     IntToStr(iUIN) +
                     '&silent">' +
                     sNameFrom +
                     '</a>:' +
                     CRLF +
                     CRLF +
                     sOutMsg;

          // send message to Telegram
          s := mIntegrationTelegramSendMessage(sID, sOutMsg, 5000);
          bResult := true;

            if JSONGetBoolean(s, 'ok', bResult) <> 0 then bResult := false;

            // if any error occured - log result to server's system scripts protocol
            if not bResult then begin
              s := 'From: ' + IntToStr(iUIN) + ', to: ' + IntToStr(iUINTo) + CRLF + s;
              mLogScriptToDisk(s);
            end; 
        end;
    end;
end;

begin

end.

В коде изменилось мало, только анализ того, что если отправляют файл — то его нужно залить на сервер Telegram.
Аватара пользователя
ota-elena
Использовала скрипт выше. Вложенные файлы не приходят в телеграм.
Ни скриншоты, ни через меню-действие вставить
В телеграм приходит пустое сообщение.
Аватара пользователя
Алексей Пикуров
Здравствуйте. Да, изменились типы сообщений для изображений и файлов, 44 и 45, соответственно. Новый скрипт:

Код: Выделить всё
// -----------------------------------------------------------------------------------
// ver 1.3 / Dec 15, 2021, (c) Alexey Pikurov, [email protected]
// -----------------------------------------------------------------------------------
function OnPrivateMessage(iCID, iUIN, iUINTo, iMsgType: integer; sMsg: string): boolean;
var
  sID, sOutMsg, sNameFrom, s: string;
  bResult: boolean;
begin
  SetScriptTimeOut(10000);

  result := true;

    if not mIsUINOnline(iUINTo) then begin
      // get sender's Telegram ID
      sID := mIntegrationTelegramGetUserIDByUIN(iUINTo);

        if sID[1] <> '-' then begin // no errors
          // get MyChat sender's display name
          sNameFrom := mGetUserFullNameByPreset(iUIN, 0);

        if (iMsgType = 44) or (iMsgType = 45) then
            sOutMsg := mExtractExternalWebLinkFromMessage(sMsg, iMsgType)
          else
            // convert MyChat message to plaint text
            sOutMsg := mConvertMsgToPlainText(sMsg, iMsgType);

          // add WEB support link and user display name to message
          sOutMsg := '<a href="' +
                     mGetServerExternalAddress(0) +
                     '/support/?uin=' +
                     IntToStr(iUIN) +
                     '&silent">' +
                     sNameFrom +
                     '</a>:' +
                     CRLF +
                     CRLF +
                     sOutMsg;

          // send message to Telegram
          s := mIntegrationTelegramSendMessage(sID, sOutMsg, 5000);
          bResult := true;

            if JSONGetBoolean(s, 'ok', bResult) <> 0 then bResult := false;

            // if any error occured - log result to server's system scripts protocol
            if not bResult then begin
              s := 'From: ' + IntToStr(iUIN) + ', to: ' + IntToStr(iUINTo) + CRLF + s;
              mLogScriptToDisk(s);
            end; 
        end;
    end;
end;

begin

end.
Аватара пользователя
ota-elena
Да, телеграм пришло сообщение в виде ссылки на файл.
Спасибо.
Аватара пользователя
Алексей Пикуров
Спасибо вам, что заметили. Добавим автоматическое обновление текста скрипта в свежей версии.
Аватара пользователя
ota-elena
Мне в этой теме спросить или новую создать?
Когда пользователя Нет на месте (допустим уехал из офиса), сообщения в телеграм не приходят. Только если оффлайн, то в телеграм сообщения отправляются.
Аватара пользователя
Алексей Пикуров
Можно и в этой :) Скрипт специально так написан, чтобы, если получатель офлайн, уведомление отправлять в Telegram-бот.

В чём проблема установить MyChat вашим сотрудникам на Android/iPhone ?
Аватара пользователя
ota-elena
У нас есть разные причины почему нужен именно Телеграм. И он нужен именно в состояниях "оффлай"н и "нет на месте"
Просто ведь можно сделать, чтобы и в статусе Нет на Месте приходили сообщения в телеграм, это было бы идеально.
Аватара пользователя
Алексей Пикуров
Да, можно написать такой скрипт, тут проблем нет. Пишете сами, либо мы на заказ. Напишите на [email protected], обсудим и сделаем.
Аватара пользователя
ota-elena
Спасибо за "пинок". Добавила пару строк в скрипт, чтобы приходили по статусу пользователя когда он не в сети. Тестирую .
Аватара пользователя
bashkov
Елена получилось сделать так чтобы сообщения приходили когда у пользователя статус "нет на месте"?
Я пробовал так, заменил строку:
if not mIsUINOnline(iUINTo) then begin
на
if (not mIsUINOnline(iUINTo)) or (mGetUserState(iUINTo) = -1) then begin

что-то не работает
Аватара пользователя
bashkov
Похоже что правильно так:
if (not mIsUINOnline(iUINTo)) or (mGetUserState(iUINTo) = 1) then begin

viewtopic.php?f=35&t=2016

iState := mGetUserState(iUIN)

Статусов всего 4:
state_offline: -1 (получатель офлайн);
state_free: 0 (получатель в сети и активен);
state_away: 1 (получатель онлайн, но его нет на месте);
state_dnd: 2 (получатель онлайн, выставил статус "не беспокоить").
Аватара пользователя
Алексей Пикуров
День добрый.

Если вам надо только "нет на месте", то достаточно:
Код: Выделить всё
if mGetUserState(iUINTo) = 1 then
Аватара пользователя
Алексей Пикуров