Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
oren.bact
Здравствуйте! На просторах форума нашел скрипт для приветствия, переделал его немного, получилось следующее.

Код: Выделить всё
procedure SendBrowserInfo(iUIN, iUINTo, iCID, iCIDTo: integer);
var
  s, sIP, sWEBSupportBrowserInfo, sWEBSupportRefLink, sWEBSupportsSysLanguage, sWEBSupportsPlatformOS,
  sGeoIP, sCountry, sCity: string;
begin
  sIP                     := mGetCIDAttribute(iCID, 'IP');
  sWEBSupportBrowserInfo  := mGetCIDAttribute(iCID, 'UserAgent');
  sWEBSupportRefLink      := mGetCIDAttribute(iCID, 'Reflink');
  sWEBSupportsSysLanguage := mGetCIDAttribute(iCID, 'Lang');
  sWEBSupportsPlatformOS  := mGetCIDAttribute(iCID, 'OS');
   
  s := '---------------' + CRLF +
       '-=WEB Support=-' + CRLF + CRLF +
       'IP: ' + sIP;
     
    if length(sWEBSupportBrowserInfo) > 0 then s := s + CRLF + 'Browser: ' + sWEBSupportBrowserInfo + CRLF;
    if length(sWEBSupportRefLink) > 0 then s := s + CRLF + 'Reflink: ' + sWEBSupportRefLink;
    if length(sWEBSupportsSysLanguage) > 0 then s := s + CRLF + 'System language: ' + sWEBSupportsSysLanguage;
    if length(sWEBSupportsPlatformOS) > 0 then s := s + CRLF + 'OS: ' + sWEBSupportsPlatformOS;
         
  sGeoIP   := GeoIPGetQuickInfo(sIP);
  sCountry := Fetch(sGeoIP, '|');
  sCity    := sGeoIP;
       
    if length(sCountry) > 0 then begin
      sGeoIP := sCountry;
           
        if length(sCity) > 0 then sGeoIP := sGeoIP + ', ' + sCity;
             
      s := s + CRLF + CRLF + sGeoIP; 
    end else sGeoIP := ''; 
     
  mSendPrivateMessage(iUIN, iUINTo, s, 21);
  mSendCustomMsgToClientConsoleByCID(iCIDTo, 'WEB support session from UIN ' + inttostr(iUIN), 'newmsg', false, true, 78);
end;

procedure SendHelloMessage(iUIN, iUINTo: integer);
var
  s: string;
  iHour: integer;
  dt: Double;
begin
  dt := Now;

    if DayOfTheWeek(dt) < 7 then begin
      iHour := HourOf(dt);
     
        if (iHour >= 8) and (iHour <= 16) then s := 'Здравствуйте! Вы обратились в службу дистанционной поддержки клиентов АНО "ЦИНТ"! Мы рады, что Вы выбрали именно нас! Какой вопрос Вас интересует?'
          else s := 'Здравствуйте! Вы обратились в службу дистанционной поддержки клиентов АНО "ЦИНТ"! Мы рады, что Вы выбрали именно нас! К сожалению, в настоящее время мы не можем Вам ответить. Пожалуйста, дождитесь начала рабочего дня или направьте Ваше обращение по электронной почте [email protected]';
    end else s := 'Здравствуйте! Вы обратились в службу дистанционной поддержки клиентов АНО "ЦИНТ"! Мы рады, что Вы выбрали именно нас! К сожалению, в настоящее время мы не можем Вам ответить. Воскресенье - выходной день. Вы можете оставить сообщение в чате, оно будет доставлено. Мы свяжемся с Вами по e-mail в рабочее время';
 
  mSendPrivateMessage(iUIN, iUINTo, s, 1);
end;

function OnPrivateRequest(iCID, iUIN, iUINTo, iRole, iRoleReciever, iTask: integer): boolean;
var
  sKey, sKeyData, sDateNow: string;
  iWhat, iCIDTo: integer;
begin
  SetScriptTimeOut(10000); // на всякий случай, вдруг будет долго работать 

  if mGetRoleNameByID(iRole) = 'WEB guests' then begin
    iCIDTo := mGetUserCID(iUINTo);
   
    sKey := 'websupp' + IntToStr(iUIN) + '-' + IntToStr(iUINTo);
   
    //mDBStorageDeleteKey(sKey);
    //mDBStorageSetData(sKey, '123');
       
    sKeyData := mDBStorageGetData(sKey);
    sDateNow := FormatDateTime('ddmmyyyy', Now);
       
      if length(sKeyData) = 0 then iWhat := 1 // ни разу не подключался к серверу
        else if sKeyData = sDateNow then iWhat := 2 // уже подключался сегодня
            else iWhat := 3; // подключался раньше, не сегодня

    mDBStorageSetData(sKey, sDateNow);

      // юзер подключается первый раз и оператор онлайн
      if (iCIDTo <> -1) and (iWhat = 1) then begin
        SendBrowserInfo(iUIN, iUINTo, iCID, iCIDTo);
        SendHelloMessage(iUIN, iUINTo);
      end else
      // если пользователь подключается первый раз вообще либо впервые за день
      if (iWhat = 1) or (iWhat = 3) then SendHelloMessage(iUIN, iUINTo);
  end;

  result := true;
end;

begin

end.

-----

В строке mSendPrivateMessage в скобках изначально стояли следующие параметры (iUIN, iUINTo, s, 21), однако сообщение приветствия не доставлялось клиентов, вместо этого был значок радара и дефис вместо приветствия. При этом сообщение было видно для оператора. Какой параметр надо прописать, чтобы исправить проблему.
Аватара пользователя
Алексей Пикуров
Справка по функции mSendPrivateMessage.
4-й параметр — это тип сообщения. Очевидно, вам нужен другой тип сообщения, чтобы его видели обе стороны. Это 1 (MSG_TYPE_TEXT)
Аватара пользователя
oren.bact
Спасибо большое, за справку, эта глава прошла мимо моих глаз и я чисто интуитивно подобрал параметр "1". И вот единственное, что немного смущает, отправка сообщения с приветствием идет от лица самого клиента, а не от имени оператора.

Ну и совсем по мелочам, наверное. 1) Галочки доставки сообщения отображаются только лишь при обновлении страницы, вроде бы ранее статусы доставки обновлялись сразу же 2) анимация "пера" не отображается в чате, как в ранних версиях, эту функцию убрали?
Аватара пользователя
Алексей Пикуров
Поменяйте местами 1 и 2-й параметры. В справке указано их назначение. Статусы отображаются, покажите, пожалуйста, скриншот, а лучше видео, где видно проблему. Пера больше нет, уведомления о наборе текста показываются иначе.
Аватара пользователя
Алексей Пикуров
Насчёт иконки рупора и статусов получилось повторить проблему, это исправим. Спасибо, что заметили.
Аватара пользователя
oren.bact
Прилагаю скрин с видео
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
oren.bact
Также, почему-то дублируется имя пользователя-оператора
Аватара пользователя
Алексей Пикуров
Баг с рендерингом сообщения (с рупором) исправлен, а касаемо того, от чьего имени пишется приветствие — разберитесь, что вы шлёте в скрипте в функции отправки приватного сообщения первым и вторым параметром (отправитель/получатель).
Аватара пользователя
Андрей Раков
Технические сообщения исправлены
Аватара пользователя
Алексей Пикуров
P.S. Статусы сообщений — доделаны.