Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
Mirzali
Доброго времени суток. Пользуемся MyChat очень давно, не так давно обновились до более свежей версии. Хотелось бы сделать интеграцию с телеграмм. Сам процесс понятен. Хотел бы попросить подсказку насчет скриптов. 2 скрипта function OnRequestByREST(sBody, sParams, sHeaders, sURL, sIPv4, sIPv6: string; iType: integer): string; и function OnPrivateMessage(iCID, iUIN, iUINTo, iMsgType: integer; sMsg: string): boolean; нашел у вас в документации, а так же есть некие маленькие части кода https://nsoft-s.com/mcserverhelp/index. ... gramid.htm и https://nsoft-s.com/mcserverhelp/index. ... gramid.htm куда их добавить?
Все ж хочется иметь возможность ответа из телеграмм отвечать в MyChat.
Аватара пользователя
Георгий Лысенко
Здравствуйте.
Для начала вам нужно перейти в админке в раздел "Инструменты" — "Скрипты". Далее нужно создать 2 скрипта: первый на событие "OnPrivateMessage", второй на "OnRequestByREST":
1.png
1.png (182.35 КБ) Просмотров: 2855


Текст скрипта для "OnPrivateMessage":
Код: Выделить всё
// -----------------------------------------------------------------------------------
// ver 1.1 / Sep 22, 2017, (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);

          // 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;
    end;
end;

begin

end.


Текст скрипта для "OnRequestByREST":
Код: Выделить всё
// -----------------------------------------------------------------------------------
// ver 2.0 / Aug 10, 2017, (c) Alexey Pikurov, [email protected]
// -----------------------------------------------------------------------------------

function OnRequestByREST(sBody, sParams, sHeaders, sURL, sIPv4, sIPv6: string; iType: integer): string;
var
  sFirstName, sLastName, sNickName, sTelegramID, sText, sData: string;
  iResult, x, iUIN, iUINFrom: integer;
begin
  sFirstName  := '';
  sLastName   := '';
  sNickName   := '';
  sTelegramID := '';
  sText       := '';

  // get request data
  JSONGetString(sBody, 'message.from.id', sTelegramID);
  JSONGetString(sBody, 'message.from.first_name', sFirstName);
  JSONGetString(sBody, 'message.from.last_name', sLastName);
  JSONGetString(sBody, 'message.from.username', sNickName);
  JSONGetString(sBody, 'message.text', sText);

    // if user is connecting to the Telegram bot for the first time
    if LowerCase(sText) = '/start' then mIntegrationTelegramAddUser(sTelegramID, sFirstName, sLastName, sNickName)
      else begin // maybe user send reply message to the bot
        iResult := JSONGetString(sBody, 'message.reply_to_message.entities[0].url', sData);
       
          if iResult = 0 then begin
            // get receiver's UIN
            x := pos('?uin=', sData) + 5;
            iUIN := StrToIntDef(copy(sData, x, pos('&', sData) - x), -1);
           
            // get sender's UIN by user Telegram ID
            iUINFrom := mIntegrationTelegramGetMyChatUINByTelegramID(sTelegramID);

              // if sender and receiver are exists
              if (iUIN <> -1) and (iUINFrom > 0) then begin
                // multi-line text
                sData := '[Telegram] ' + ReplaceString(sText, #10, CRLF, true, false);
                // send private message into MyChat
                mSendPrivateMessage(iUINFrom, iUIN, sData, 1, true);
              end; 
          end;
     
      end;
     
  result := '{}';
end;

begin

end.