Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Аватара пользователя
td-automatika
Здравствуйте. Есть скрипт, по факту он должен выводить одно сообщение (приветствие) в промежутке с 8.30 до 18 часов и другое сообщение с 19 до 7.59 другое сообщение.
Привожу код скрипта.

Код: Выделить всё
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, true);
  mSendCustomMsgToClientConsoleByCID(iCIDTo, 'WEB support session from UIN ' + inttostr(iUIN), 'newmsg', false, true, 78);
end;

procedure SendHelloMessage(iUIN, iUINTo: integer);
var
  s, sUserName, sHelloMsg: string;
  iHour, x: integer;
begin
  iHour := HourOf(Now);
           
    case iHour of
      8..18: s := 'Здравствуйте, что вас интересует?';
      19..7: s := 'К сожалению, сейчас мы не можем Вам ответить. Пожалуйста, дождитесь начала рабочего дня или направьте Ваше обращение по электронной почте"';
   end;
           
  sUserName := mGetUserAttribute(iUIN, 'FirstName');
           
    if length(sUserName) > 0 then s := s + '' + sUserName + ''
      else s := s + '';
             
  x := Random(8);
               
    case x of
      0: sHelloMsg := '';
      1: sHelloMsg := '';
      2: sHelloMsg := '';
      3: sHelloMsg := '';
      4: sHelloMsg := '';
      5: sHelloMsg := '';
      6: sHelloMsg := '';
      7: sHelloMsg := '';
    end;
               
  s := s + sHelloMsg;

  mSendPrivateMessage(iUINTo, iUIN, s, 1, true);
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.


Проблема в том, что приветствие 19..7 не работает. Скажите пожалуйста, в чем проблема.
И второй вопрос. Блок x := Random(8); ... нам не нужен с какой строки и по какую его можно удалить?
Есть ли возможность задать сообщение в выходные дни?
Аватара пользователя
Алексей Пикуров
Добрый день.

Не работает, потому что так записывать условие неправильно. Если пишете диапазоны в case, то они должны записываться от меньшего — к большему. А для вашей задачи case и вовсе не нужен, хватит обычного "if-then-else":

Код: Выделить всё
procedure SendHelloMessage(iUIN, iUINTo: integer);
var
  s: string;
  iHour: integer;
  dt: Double;
begin
  dt := Now;

    if DayOfTheWeek(dt) < 6 then begin
      iHour := HourOf(dt);
     
        if (iHour >= 8) and (iHour <= 18) then s := 'Здравствуйте, что вас интересует?'
          else s := 'К сожалению, сейчас мы не можем Вам ответить. Пожалуйста, дождитесь начала рабочего дня или направьте Ваше обращение по электронной почте';
    end else s := 'Здравствуйте, мы работаем с понедельника по пятницу, с 8 утра до 6 вечера. Напишите на email, ответим в понедельник утром';
 
  mSendPrivateMessage(iUINTo, iUIN, s, 1, true);
end;

Я привёл код только одной функции, её замените, остальное в силе. Переношу тему в раздел скриптов.
Аватара пользователя
td-automatika
Спасибо. А какой знак используется в качестве разделителя? То есть, хотелось бы сделать промежуток не 8:00 - 18:00, а 8:30 - 18:00.
Аватара пользователя
Алексей Пикуров
Не понял, о каком разделителе вы спрашиваете. Если вам надо учитывать ещё и минуты, а не только часы, то скрипт нужно переписать с учётом этого. Другую логику сделать, в примере я анализирую только часы.
Аватара пользователя
td-automatika
Да, учитывать минуты. Думал можно минуты просто указать, через запятую например. Интересует время 8:30 - 18:00.
Аватара пользователя
Алексей Пикуров
Переделайте условие и алгоритм рассчёта с условием минут, а не только часов, как вам нужно. Все нужные функции описаны в справке.

MyChat Scripts Engine: работа с датой и временем