Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
Алексей Пикуров
Общая идея чат-бота такая: пользователь открывает приватный разговор с роботом Elisa (UIN = 0) и пишет ему команды. Если робот понимает, что от него хотят — отвечает, если нет — пишет в ответ справку.

Для примера я сделал обработку для IP адреса. Вы пишете роботу IP-адрес, а он в ответ — страну и город. Для этого была включена интеграция с GeoIP. В скрипте используется регулярное выражение для определения, что введённая строка — действительно текстовый IPv4-адрес.

Как это выглядит в редакторе скриптов:

elisa-bot-example.png
Пример работы встроенного бота в MyChat
elisa-bot-example.png (88.9 КБ) Просмотров: 7843

Текст скрипта:
Код: Выделить всё
// ---------------------------------------
// Script created by Alexey Pikurov (UIN 1)
// 15.09.2018 14:23:27
// ---------------------------------------

const
  BOT_VERSION = '1';
  BOT_RELEASE_DATE = 'Sep 15, 2018';
 
  IP_ADDRESS_REGEXP = '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' +
                      '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' +
                      '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' +
                      '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b';
var
  bFlag: boolean;
  sReplyText: string;

function GetGeoIPInfo(sIP: string): boolean;
var
  sCountry, sTown, s: string;
begin
  if RegExpIsMatch(sIP, IP_ADDRESS_REGEXP) then begin
    s := GeoIPGetQuickInfo(sIP);

      if length(s) = 0 then sReplyText := 'IP: ' + sIP + CRLF + 'unknown IP address (maybe local?)'
        else begin
          sCountry := Fetch(s, '|');
          sTown    := s;
     
            if length(sTown) > 0 then sTown := ', ' + sTown;
   
          sReplyText := 'IP: ' + sIP + CRLF + sCountry + sTown;
        end;
       
    result := true;
  end else result := false;
end;

procedure BotHelp;
begin
  sReplyText := '-=Elisa Bot=-' + CRLF +
                'v.' + BOT_VERSION + ' / ' + BOT_RELEASE_DATE + CRLF + CRLF +
                '? - справка по командам' + CRLF +
                '<IP адрес> - узнать страну и город по адресу IPv4';
end;

function OnPrivateMessage(iCID, iUIN, iUINTo, iMsgType: integer; sMsg: string): boolean;
var
  sCmd: string;
begin
  bFlag := true;
  sReplyText := '';
 
    // если получатель сообщения - встроенный робот Elisa с UIN = 0
    if iUINTo = 0 then begin
      // получить текст команды
      sCmd := UpperCase(mConvertMsgToPlainText(sMsg, iMsgType));
     
        if GetGeoIPInfo(sCmd) then bFlag := false // если это IP-адрес
        else begin
          BotHelp; // показываем справку
          bFlag := false;
        end; 
    end;
 
   // если команда была обработана, то "гасим" исходное сообщение
   // и отправляем новое, от имени встроенного бота Elisa с UIN = 0
   if not bFlag then
     mSendPrivateMessage(0, iUIN, sReplyText, 1);
   
  result := bFlag;
end;

begin

end.


Как это выглядит в MyChat Client?

elisa-bot-mychat-client.png
Ответ бота Elisa в чате на запрос пользователя
elisa-bot-mychat-client.png (7.17 КБ) Просмотров: 7843
Аватара пользователя
maxi812
Сорян за глупость..
но оно ругается
Screenshot_3.jpg
1
Screenshot_3.jpg (310.57 КБ) Просмотров: 3217
Аватара пользователя
Алексей Пикуров
Откройте справку по скриптам, в функции другое количество параметров. Скрипт устарел, поправлю позже.
Аватара пользователя
Алексей Пикуров
Функция mSendPrivateMessage, последний параметр уберите. Исходный пост я поправил.